将包含单引号的行的YAML文本替换为yq
我试图通过bash脚本编辑一个YAML文件来替换几个特定的值 例如,在下面的文件中,我想将“command”的值从将包含单引号的行的YAML文本替换为yq,yaml,yq,Yaml,Yq,我试图通过bash脚本编辑一个YAML文件来替换几个特定的值 例如,在下面的文件中,我想将“command”的值从 sh-c'fabric ca server init-b admin:adminpw' 到sh-c'fabric ca服务器启动-b admin:adminpw' 之前(原始文件): 之后(预期结果): 最初,我是这样使用sed的: sed-i“10s/command:.*/command:sh-c'fabric ca server start-b$UNVAR:$PWVAR'/“/
sh-c'fabric ca server init-b admin:adminpw'
到sh-c'fabric ca服务器启动-b admin:adminpw'
之前(原始文件):
之后(预期结果):
最初,我是这样使用sed的:
sed-i“10s/command:.*/command:sh-c'fabric ca server start-b$UNVAR:$PWVAR'/“/docker compose.yaml
它可以工作,但非常笨拙,因为它需要实际的行号(可以更改)
我发现了yq
,它看起来更优雅,但我在这里很难让它工作,因为它将-c
解释为一个标志。(我试着用“---”来纠正这个问题,但没有找到如何让它工作的方法。)
yq w-i./docker-compose.yaml fabric-ca-server.command sh-c'fabric ca-server start-b$TLSCA\u UN:$TLSCA\u PW'
关于如何使用yq正确执行此操作,有什么建议吗?修复非常简单。在write中,语法采用以下形式
yq write [yaml_file] [path_expression] [value] [flags]
您正确地标识了路径\u表达式
,但是没有包含正确的引号来包装替换文本。在大多数shell(包括bash
)中,将内容包装在双引号上会保留字符串的文字值(嵌入的双引号除外)。所以你只需要做
yq w docker-compose.yaml fabric-ca-server.command "sh -c 'fabric-ca-server start -b admin:adminpw'"
确认替换文本符合“预期”后,添加
-i
标记以使文件更改永久化。我假设您正在使用。你能发布版本详情吗yq——版本
?@Inian是的——我今天早些时候从github下载了它。我有yq版本3.3.2
yq write [yaml_file] [path_expression] [value] [flags]
yq w docker-compose.yaml fabric-ca-server.command "sh -c 'fabric-ca-server start -b admin:adminpw'"