ubuntu 替换YAML文件内的版本

eqqqjvef  于 2023-02-18  发布在  其他
关注(0)|答案(2)|浏览(238)

我有这个YAML文件:

openapi: 3.0.0
info:
  title: Test
  description: >-
    This is the official REST API documentation for all available routes
    provided by the **Test** plugin.
  version: 2.0.0
servers:
  - url: https://entwicklungsumgebung
components:
  securitySchemes:
    basicAuth:
      type: http

在我的CI管道中,我试图修改第7行的版本。在文件中间,有多个名为test_versionprod_version的键不应被替换。为此,我编写了sed命令:

sed -i '' 's/^version: .*/version: 3.0.0/' test.yml

最初,我没有在s/之后使用^,但是这也匹配了version之前的所有内容。现在,没有任何内容被替换。知道我做错了什么吗?

whhtz7ly

whhtz7ly1#

您必须保留空格,因此您要么必须匹配整行,要么使用捕获组:

sed -i '' 's/^\([[:blank:]]*version:\) .*/\1 3.0.0/' test.yml

或者您可以只匹配version,但可能会匹配到不应该匹配的地方:

sed -i '' 's/\(version:\) .*/\1 3.0.0/' test.yml

一个更健壮的解决方案是使用一个可以解析YAML的工具,比如yq

yq -i '.info.version = "3.0.0"' test.yml
z0qdvdin

z0qdvdin2#

我会使用find..来查找所有YML文件。然后,在正则表达式中就不需要^了。作为预防措施,我还使用-i标志作为后缀,使用/g表示“全局”,以防文件中不止一次提到version:--

编辑在替换中,也要在version--前保留白色以保留缩进

find ./ -name '*.yml' -exec sed -i "s/ version: .*/ version: 3.0.0/g" {} \;

因此,此文件之前:

openapi: 3.0.0
info:
  title: Test
  description: >-
    This is the official REST API documentation for all available routes
    provided by the **Test** plugin.
  test_version: 5.2.2
  prod_version: 4.3.3
 version: 2.0.0
servers:
  - url: https://entwicklungsumgebung
components:
  securitySchemes:
    basicAuth:
      type: http

输出:

openapi: 3.0.0
info:
  title: Test
  description: >-
    This is the official REST API documentation for all available routes
    provided by the **Test** plugin.
  test_version: 5.2.2
  prod_version: 4.3.3
 version: 3.0.0
servers:
  - url: https://entwicklungsumgebung
components:
  securitySchemes:
    basicAuth:
      type: http

相关问题