sedやawkで、置換前の値を元に、計算した値で置換を行いたいというのがあったので、備忘で残しておく。 例えば、以下のようなファイルに対し、数字を3足した内容を出力させたいとする。

[root@BS-PUB-CENT7-01 ~]# cat test.txt
test 1
test 2
test 3
test 4
test 5
test 6
test 7
test 8
test 9
test 10

1. gnu sedの場合

sedの場合、sed自体には計算を行う機能がないため、後方参照とサブプロセス、さらに後方参照で得た値をサブプロセスに渡すために、置換した値をOSのコマンドとして利用して対応する。

cat test.txt | sed 's/\([a-z]*\) \([0-9]*\)/echo \1 $((\2 + 3))/eg'
[root@BS-PUB-CENT7-01 ~]# cat test.txt | sed 's/\([a-z]*\) \([0-9]*\)/echo \1 $((\2 + 3))/eg'
test 4
test 5
test 6
test 7
test 8
test 9
test 10
test 11
test 12
test 13

2. awkを用いる場合

awkを用いる場合は、 今回の例のような場合は単純で、以下のようにコマンドを実行してやれば良い。

awk '{print $1,$2 + 3}'
[root@BS-PUB-CENT7-01 ~]# cat test.txt | awk '{print $1,$2 + 3}'
test 4
test 5
test 6
test 7
test 8
test 9
test 10
test 11
test 12
test 13

基本はawkを使うといいだろう。 対象のファイルを上書き保存したいといった場合であれば、sedを使うほうが良いかもしれない。