【问题标题】:Replacing YAML text with yq for a line containing single quotes用 yq 替换包含单引号的行的 YAML 文本
【发布时间】:2020-08-13 03:29:22
【问题描述】:

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

【问题讨论】:

  • 我假设您使用的是github.com/mikefarah/yq。能发一下版本详情吗? yq --version?
  • @Inian 是的 - 我今天早些时候从 github 下载了它。我有 yq 版本 3.3.2

标签: yaml yq


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-12-14
    • 2014-01-18
    • 1970-01-01
    • 2016-09-08
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多