如何防止yq删除注释和空行?
How to prevent yq removing comments and empty lines?
这里我问的是如何用yq编辑yaml。我收到了最佳答案。但默认情况下 yq
会删除注释和空行。如何防止这种行为?
input.yml
# Specify a command to be executed
# like `/bin/bash -l`, `ls`, or any other commands
# the default is bash for Linux
# or powershell.exe for Windows
command: fish -l
# Specify the current working directory path
# the default is the current working directory path
cwd: null
# Export additional ENV variables
env:
recording: true
# Explicitly set the number of columns
# or use `auto` to take the current
# number of columns of your shell
cols: 110
执行
yq -y . input.yml
结果
command: fish -l
cwd: null
env:
recording: true
cols: 110
在某些有限的情况下,您可以将 diff/patch 与 yq 一起使用。
例如,如果 input.yml
包含您的输入文本,则命令
$ yq -y . input.yml > input.yml.1
$ yq -y .env.recording=false input.yml > input.yml.2
$ diff input.yml.1 input.yml.2 > input.yml.diff
$ patch -o input.yml.new input.yml < input.yml.diff
创建了一个文件 input.yml.new
,其中保留了注释,但是
记录更改为假:
# Specify a command to be executed
# like `/bin/bash -l`, `ls`, or any other commands
# the default is bash for Linux
# or powershell.exe for Windows
command: fish -l
# Specify the current working directory path
# the default is the current working directory path
cwd: null
# Export additional ENV variables
env:
recording: false
# Explicitly set the number of columns
# or use `auto` to take the current
# number of columns of your shell
cols: 110
这是对 评论的改进。
在我的情况下还不够 diff -B
和 diff -wB
因为它仍然不保留空行并继续生成整个文件差异作为单个块而不是许多小块。
这是输入示例 (test.yml
):
# This file is automatically generated
#
content-index:
timestamp: 1970-01-01T00:00:00Z
entries:
- dirs:
- dir: dir-1/dir-2
files:
- file: file-1.dat
md5-hash:
timestamp: 1970-01-01T00:00:00Z
- file: file-2.dat
md5-hash:
timestamp:
- file: file-3.dat
md5-hash:
timestamp:
- dir: dir-1/dir-2/dir-3
files:
- file: file-1.dat
md5-hash:
timestamp:
- file: file-2.dat
md5-hash:
timestamp:
如果尝试编辑字段并生成差异文件:
diff -B test.yml <(yq -y ".\"content-index\".timestamp=\"2022-01-01T00:00:00Z\"" test.yml)
它确实保留删除空行:
5,7c2
<
< timestamp: 1970-01-01T00:00:00Z
<
---
> timestamp: '2022-01-01T00:00:00Z'
在所有地方添加 null
而不是空字段,并更改其余的时间戳字段(这意味着您必须使用“...”按原样保留这些字段):
17,19c8,9
< md5-hash:
< timestamp: 1970-01-01T00:00:00Z
<
---
> md5-hash: null
> timestamp: '1970-01-01T00:00:00+00:00'
-wB
标志将差异文件从单个块更改为多个块,但仍会删除空行。
这里提到了这个差异问题:https://unix.stackexchange.com/questions/423186/diff-how-to-ignore-empty-lines/423188#423188
要解决这个问题,您必须将它与 grep 一起使用:
diff -wB <(grep -vE '^\s*$' test.yml) <(yq -y ".\"content-index\".timestamp=\"2022-01-01T00:00:00Z\"" test.yml)
但它仍然会删除评论:
1,2d0
< # This file is automatically generated
< #
所以完整的单行是:
diff -wB <(grep -vE '^\s*(#|$)' test.yml) <(yq -y ".\"content-index\".timestamp=\"2022-01-01T00:00:00Z\"" test.yml) | patch -o - test.yml 2>/dev/null
其中 2>/dev/null
代表忽略补丁警告,例如:
Hunk #1 succeeded at 6 (offset 4 lines).
要在实际代码中避免它,您可以改用 -s
标志:
... | patch -s -o ...
更新:
作为 shell 脚本,GitHub 动作管道复合动作有一个更好的完整实现。
GitHub复合动作:https://github.com/andry81-devops/gh-action--accum-content
Bash 脚本:
https://github.com/andry81-devops/gh-workflow/blob/master/bash/cache/accum-content.sh
https://github.com/andry81-devops/gh-workflow/blob/master/bash/github/init-yq-workflow.sh
该实现可以使用 yq
个实现中的 2 个:
- https://github.com/kislyuk/yq -
jq
包装器(默认 Cygwin 发行版)
- https://github.com/mikefarah/yq - Go 实现(默认 Ubuntu 20.04 发行版)
搜索:yq_edit
、yq_diff
、yq_patch
函数
这里yq
会删除注释和空行。如何防止这种行为?
input.yml
# Specify a command to be executed
# like `/bin/bash -l`, `ls`, or any other commands
# the default is bash for Linux
# or powershell.exe for Windows
command: fish -l
# Specify the current working directory path
# the default is the current working directory path
cwd: null
# Export additional ENV variables
env:
recording: true
# Explicitly set the number of columns
# or use `auto` to take the current
# number of columns of your shell
cols: 110
执行
yq -y . input.yml
结果
command: fish -l
cwd: null
env:
recording: true
cols: 110
在某些有限的情况下,您可以将 diff/patch 与 yq 一起使用。
例如,如果 input.yml
包含您的输入文本,则命令
$ yq -y . input.yml > input.yml.1
$ yq -y .env.recording=false input.yml > input.yml.2
$ diff input.yml.1 input.yml.2 > input.yml.diff
$ patch -o input.yml.new input.yml < input.yml.diff
创建了一个文件 input.yml.new
,其中保留了注释,但是
记录更改为假:
# Specify a command to be executed
# like `/bin/bash -l`, `ls`, or any other commands
# the default is bash for Linux
# or powershell.exe for Windows
command: fish -l
# Specify the current working directory path
# the default is the current working directory path
cwd: null
# Export additional ENV variables
env:
recording: false
# Explicitly set the number of columns
# or use `auto` to take the current
# number of columns of your shell
cols: 110
这是对
在我的情况下还不够 diff -B
和 diff -wB
因为它仍然不保留空行并继续生成整个文件差异作为单个块而不是许多小块。
这是输入示例 (test.yml
):
# This file is automatically generated
#
content-index:
timestamp: 1970-01-01T00:00:00Z
entries:
- dirs:
- dir: dir-1/dir-2
files:
- file: file-1.dat
md5-hash:
timestamp: 1970-01-01T00:00:00Z
- file: file-2.dat
md5-hash:
timestamp:
- file: file-3.dat
md5-hash:
timestamp:
- dir: dir-1/dir-2/dir-3
files:
- file: file-1.dat
md5-hash:
timestamp:
- file: file-2.dat
md5-hash:
timestamp:
如果尝试编辑字段并生成差异文件:
diff -B test.yml <(yq -y ".\"content-index\".timestamp=\"2022-01-01T00:00:00Z\"" test.yml)
它确实保留删除空行:
5,7c2
<
< timestamp: 1970-01-01T00:00:00Z
<
---
> timestamp: '2022-01-01T00:00:00Z'
在所有地方添加 null
而不是空字段,并更改其余的时间戳字段(这意味着您必须使用“...”按原样保留这些字段):
17,19c8,9
< md5-hash:
< timestamp: 1970-01-01T00:00:00Z
<
---
> md5-hash: null
> timestamp: '1970-01-01T00:00:00+00:00'
-wB
标志将差异文件从单个块更改为多个块,但仍会删除空行。
这里提到了这个差异问题:https://unix.stackexchange.com/questions/423186/diff-how-to-ignore-empty-lines/423188#423188
要解决这个问题,您必须将它与 grep 一起使用:
diff -wB <(grep -vE '^\s*$' test.yml) <(yq -y ".\"content-index\".timestamp=\"2022-01-01T00:00:00Z\"" test.yml)
但它仍然会删除评论:
1,2d0
< # This file is automatically generated
< #
所以完整的单行是:
diff -wB <(grep -vE '^\s*(#|$)' test.yml) <(yq -y ".\"content-index\".timestamp=\"2022-01-01T00:00:00Z\"" test.yml) | patch -o - test.yml 2>/dev/null
其中 2>/dev/null
代表忽略补丁警告,例如:
Hunk #1 succeeded at 6 (offset 4 lines).
要在实际代码中避免它,您可以改用 -s
标志:
... | patch -s -o ...
更新:
作为 shell 脚本,GitHub 动作管道复合动作有一个更好的完整实现。
GitHub复合动作:https://github.com/andry81-devops/gh-action--accum-content
Bash 脚本:
https://github.com/andry81-devops/gh-workflow/blob/master/bash/cache/accum-content.sh
https://github.com/andry81-devops/gh-workflow/blob/master/bash/github/init-yq-workflow.sh
该实现可以使用 yq
个实现中的 2 个:
- https://github.com/kislyuk/yq -
jq
包装器(默认 Cygwin 发行版) - https://github.com/mikefarah/yq - Go 实现(默认 Ubuntu 20.04 发行版)
搜索:yq_edit
、yq_diff
、yq_patch
函数