将 YAML 文本替换为包含单引号的行的 yq
Replacing YAML text with yq for a line containing single quotes
我正在尝试编辑 YAML 文件以通过 bash 脚本替换几个特定值。
例如,在下面的文件中,我想将“command”的值从
sh -c 'fabric-ca-server init -b admin:adminpw'
至 sh -c 'fabric-ca-server start -b admin:adminpw'
之前(原始文件):
fabric-ca-server:
image: hyperledger/fabric-ca:amd64-1.4.7
container_name: fabric-ca-server
ports:
- "7054:7054"
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
volumes:
- "./fabric-ca-server:/etc/hyperledger/fabric-ca-server"
command: sh -c 'fabric-ca-server init -b admin:adminpw'
之后(期望的结果):
fabric-ca-server:
image: hyperledger/fabric-ca:amd64-1.4.7
container_name: fabric-ca-server
ports:
- "7054:7054"
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
volumes:
- "./fabric-ca-server:/etc/hyperledger/fabric-ca-server"
command: sh -c 'fabric-ca-server start -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_UN:$TLSCA_PW'
关于如何使用 yq 正确执行此操作的任何建议?
修复非常简单。在 mikefarah/yq 中,写入语法采用
形式
yq write [yaml_file] [path_expression] [value] [flags]
您对 path_expression
的识别是正确的,但没有包含正确的引号来包裹替换文本。在大多数 shell(包括 bash
)中,用双引号包裹内容会保留字符串的字面值(嵌入式双引号除外)。所以你只需要做
yq w docker-compose.yaml fabric-ca-server.command "sh -c 'fabric-ca-server start -b admin:adminpw'"
一旦您确认替换文本符合“预期”,添加 -i
标记以使文件更改永久生效。
我正在尝试编辑 YAML 文件以通过 bash 脚本替换几个特定值。
例如,在下面的文件中,我想将“command”的值从
sh -c 'fabric-ca-server init -b admin:adminpw'
至 sh -c 'fabric-ca-server start -b admin:adminpw'
之前(原始文件):
fabric-ca-server:
image: hyperledger/fabric-ca:amd64-1.4.7
container_name: fabric-ca-server
ports:
- "7054:7054"
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
volumes:
- "./fabric-ca-server:/etc/hyperledger/fabric-ca-server"
command: sh -c 'fabric-ca-server init -b admin:adminpw'
之后(期望的结果):
fabric-ca-server:
image: hyperledger/fabric-ca:amd64-1.4.7
container_name: fabric-ca-server
ports:
- "7054:7054"
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
volumes:
- "./fabric-ca-server:/etc/hyperledger/fabric-ca-server"
command: sh -c 'fabric-ca-server start -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_UN:$TLSCA_PW'
关于如何使用 yq 正确执行此操作的任何建议?
修复非常简单。在 mikefarah/yq 中,写入语法采用
形式yq write [yaml_file] [path_expression] [value] [flags]
您对 path_expression
的识别是正确的,但没有包含正确的引号来包裹替换文本。在大多数 shell(包括 bash
)中,用双引号包裹内容会保留字符串的字面值(嵌入式双引号除外)。所以你只需要做
yq w docker-compose.yaml fabric-ca-server.command "sh -c 'fabric-ca-server start -b admin:adminpw'"
一旦您确认替换文本符合“预期”,添加 -i
标记以使文件更改永久生效。