yq - 添加多行字符串

rel*_*one 5 bash base64 yaml yq

我正在使用 yq (类似于 jq 但用于 yaml 文件)。我的目标是做到以下几点。我有一个类似于

-------BEGIN CERTIFICATE-------
asdoqijepoqjwe1i49i120941p2j4omslasdajsdqweqwe
qwelqjwkasdlajsölkjasldkjakljsdlkjasdasdpiqwe
-------END CERTIFICATE--------
Run Code Online (Sandbox Code Playgroud)

我有一个 yaml 文件(在本例中为 Openshift 模板),如下所示

apiVersion: v1
kind: Template
objects:
- apiVersion: v1
  kind: Route
  tls:
   certificate:
   key:
  someOther: stuff
Run Code Online (Sandbox Code Playgroud)

现在我的目标是将证书注入到 yaml 中,以便输出看起来像这样

apiVersion: v1
...
    certificate: |
      -------BEGIN CERTIFICATE-------
      asdoqijepoqjwe1i49i120941p2j4omslasdajsdqweqwe
      qwelqjwkasdlajsölkjasldkjakljsdlkjasdasdpiqwe
      -------END CERTIFICATE--------
Run Code Online (Sandbox Code Playgroud)

然而,互联网搜索和文档都没有任何帮助。我得到的最接近的是使用

yq w /tmp/template.yaml objects[0].tls.certificate "\n$(cat cert.pem)"

给我留下以下输出

certificate: !!binary |
      fC0KLS0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0tLQphc2RvcWlqZXBvcWp3ZTFpND
      lpMTIwOTQxcDJqNG9tc2zDYXNkYWpzZMNxd2Vxd2UKcXdlbHFqd2vDYXNkbGFqc8O2bGtq
      YXNsZGtqYWtsanNkbGtqYXNkYXNkcGlxd2UKLS0tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS
      0tLS0t
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这是我想添加的以 !!binary | 开头的 base64 编码值。任何想法发生了什么以及如何实现我想要的输出?

mik*_*e.f 7

请注意,在 bash 中,当您使用 '$(..)' 时,它将修剪尾随换行符(这就是 yaml 字符串块以而|-不是|.

要获取|(并包括尾随的换行符),您需要:

IFS= read -rd '' output < <(cat cert.pem)
output=$output yq e '.objects[0].tls.certificate = strenv(output)' myfile.yml
Run Code Online (Sandbox Code Playgroud)

免责声明:我写的是yq

  • 您应该将 `&lt; &lt;(cat cert.pem)` 替换为 `&lt; cert.pem` (2认同)

jpm*_*rin 2

我已经测试了@Inian 的建议并且yq3它有效。

\n

也可以使用yq4以下语法来实现:

\n

模板.yml

\n
# template.yml\napiVersion: v1\nkind: Template\nobjects:\n  - apiVersion: v1\n    kind: Route\n    tls:\n      certificate:\n      key:\n    someOther: stuff\n
Run Code Online (Sandbox Code Playgroud)\n

证书.pem

\n
-------BEGIN CERTIFICATE-------\nasdoqijepoqjwe1i49i120941p2j4omslasdajsdqweqwe\nqwelqjwkasdlajs\xc3\xb6lkjasldkjakljsdlkjasdasdpiqwe\n-------END CERTIFICATE--------\n
Run Code Online (Sandbox Code Playgroud)\n

命令

\n
yq eval '.objects[0].tls.certificate = "'"$(< cert.pem)"'"' template.yml\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
apiVersion: v1\nkind: Template\nobjects:\n  - apiVersion: v1\n    kind: Route\n    tls:\n      certificate: |-\n        -------BEGIN CERTIFICATE-------\n        asdoqijepoqjwe1i49i120941p2j4omslasdajsdqweqwe\n        qwelqjwkasdlajs\xc3\xb6lkjasldkjakljsdlkjasdasdpiqwe\n        -------END CERTIFICATE--------\n      key:\n    someOther: stuff\n
Run Code Online (Sandbox Code Playgroud)\n