テキストの置換(文字列の置換)はsedコマンドでよく使う機能になります。
テキストの置換はsコマンドを使います。sコマンドのsはsubstituteを意味します。
sコマンドは
1 |
s/regexp/replacement/flag |
で利用できます。
機能は正規表現にマッチングした文字列を置換したい文字列に置換します。
flagでどの程度置き換えるか等を制御できます。例えば、flagがない場合は最初に一致した文字列を置換します。
1 2 |
$ echo 'aaabbbaaa' | sed 's/aaa/ccc/' cccbbbaaa |
フラグ
フラグ | 説明 |
---|---|
g | マッチングしたすべての文字列を置換 |
<number> | n番目にマッチングしたすべての文字列を置換 |
p | 置換時にパターンスペースを表示 |
w <wfile> | 置換時に結果をwfileに書き込み |
e | (GNU拡張)置換時にその置換文字列をコマンドとして実行しその結果に置換 |
iまたはI | (GNU拡張)regexpを大文字小文字の区別しない |
mまたはM | (GNU拡張)複数行モード |
gや<number>のフラグを用いるとマッチングしたすべての文字列を置換したり、マッチングしたn番目の文字列を置換できます。
1 2 3 4 |
$ echo 'aaabbbaaa' | sed 's/aaa/ccc/g' cccbbbccc $ echo 'aaabbbaaa' | sed 's/aaa/ccc/2' aaabbbccc |
POSIX仕様ではgと<number>を同時に使用した場合の動作を規定していませんが、GNU仕様ではn番目以前の文字列を無視し、その後の文字列はすべて置換します。
1 2 |
$ echo 'aaabbbaaadddaaa' | sed 's/aaa/ccc/2g' aaabbbcccdddccc |
置換結果をファイルに書き込み
wフラグは置換した結果をファイルに書き込むことができます。
1 2 3 4 5 6 7 |
$ echo -e 'aaa1\nbbb\naaa2' | sed 's/aaa/ccc/gw result' ccc1 bbb ccc2 $ cat result ccc1 ccc2 |
このフラグのGNU拡張として/dev/stdoutと/dev/stderrの特別なファイル名が利用できます。
eフラグ
GNU拡張のeフラグは置換時にその置換文字列をコマンドとして実行し、その結果に置換します。
簡単な例として以下のようなコマンドが考えられます。
1 2 |
$ echo 'echo aaa' | sed 's/aaa/bbb/e' bbb |
他にも、memo.txtを作成し、
memo.txt
1 2 3 4 |
# echo $HEADER memo 2*33= # echo $((2*33)) |
のようにスクリプトを埋め込むみたいにして、sedコマンドで変換するような用途が考えられます。
1 2 3 4 5 |
$ HEADER='memo.txt' sed 's/^# //e' memo.txt memo.txt memo 2*33= 66 |
ただし、eフラグの利用の際は意図しないコマンドが実行されないように注意が必要でしょう。