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 进行操作,这里有一种受cat -n
GNU sed 手册中示例启发的方法(也适用于 BSD 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 -E -f inc.sed infile
所有情况下的输出:
reconnection_delay: 50
max_attempts: 500
assets_version: 5361