sed には算術演算を行う組み込みの方法がないため、簡単ではありません。
パール
適切な yaml 解析を行う以外に、次のようなワンライナーで問題を解決できます。
perl -anE '$, = " "; $F[1]++ if $F[0] =~ /assets_version/; say @F'
スイッチは-a
入力を配列に分割@F
し、フィールドへのアクセスを提供します。
シード
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
}'
1行で同じ:
sed -r '/assets_version/ { h; s/[^:]+:\s*(.*)/echo \1 + 1 | bc/e; G; s/([^\n]+)\n([^:]+).*/\2: \1/ }'
cat -n
純粋な sed でそれを行う方法を知りたい場合は、GNU sed マニュアルの例に触発された 1 つの方法を次に示します (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