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

时间:2020-08-12 19:08:15

标签: yaml yq

我正在尝试编辑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正确执行此操作的任何建议?

1 个答案:

答案 0 :(得分:0)

此修复程序非常简单。在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标签以使文件更改永久生效。