将包含单引号的行的YAML文本替换为yq

将包含单引号的行的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'/“/

我试图通过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'/“/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'"