sed 没有任何内置的算术方法,所以不容易做到。
perl
除了进行正确的 yaml 解析之外,您还可以使用这样的单行代码:
perl -anE '$, = " "; $F[1]++ if $F[0] =~ /assets_version/; say @F'
-a 开关将输入拆分为@F 数组,从而可以访问字段。
sed
GNU sed 可以调用外部程序,所以在 bc 的帮助下你可以这样做:
/assets_version/ {
h # save line to hold space
s/[^:]+:\s*(.*)/echo \1 + 1 | bc/e # convert line to 'echo num + 1 | bc'
# and pass on to /bin/sh
G # append hold space to pattern space
s/([^\n]+)\n([^:]+).*/\2: \1/ # reorder to replace with incremented
# number
}'
一行相同:
sed -r '/assets_version/ { h; s/[^:]+:\s*(.*)/echo \1 + 1 | bc/e; G; s/([^\n]+)\n([^:]+).*/\2: \1/ }'
如果您想知道如何使用纯 sed 进行操作,以下是受 GNU sed 手册中的 cat -n 示例启发的一种方法(也适用于 BSD sed):
inc.sed
/assets_version/ {
h; # save for later
s/[^:]+:\s*//; # only keep number
/^9*$/ s/^/0/; # need one more number
s/.9*$/_&/; # mark what will change
# when incrementing
H; # save for later
s/^.*_//; # only keep what will
# change
y/0123456789/1234567890/; # transliterate numbers
G; # append hold space
s/([^\n]+)\n([^:]+:\s*)[^\n]+\n([^_]*).*/\2\3\1/; # reorder to get result
}
注意,这只适用于非负整数。
使用 GNU sed,像这样运行它:
sed -r -f inc.sed infile
BSD sed:
sed -E -f inc.sed infile
所有情况下的输出:
reconnection_delay: 50
max_attempts: 500
assets_version: 5361