gnu sed のアンドキュメンテッドな機能

sed の s コマンドに、man sed に書かれていない機能が色々あるようだ。
s/正規表現/置換文字列/オプション のオプションで、
g … global(複数回置換)
p … print(置換後の文字列を表示)
i … ignore case(正規表現で英大文字小文字を区別しない)
は知られている。

$ for x in {0..9} {A..Z} {a..z};do echo -n $x:; echo a | sed s/a/b/$x; done

でエラーにならない文字を調べてみる。


ということで、機能を調べると、
数字 … 指定番目のマッチのみ置換
数字g … 指定番目以降のマッチを置換
e … 置換後の文字列をシェルコマンドとして実行してその出力で置換
m … 改行文字にマッチしない
w … 置換後の文字列をファイルに書き込む
がある。また、I と M はそれぞれ i と m と同じ。

$ echo {1..10} | sed 's/ /-/3'
1 2 3-4 5 6 7 8 9 10
$ echo {1..10} | sed 's/ /-/3g'
1 2 3-4-5-6-7-8-9-10

$ echo {1..10} | sed 's/ / + /g;s/.*/expr &/e'
55

$ seq 5 | sed 's/3/&&&/w/tmp/work'
1
2
333
4
5
$ cat /tmp/work
333

$ echo $'a\nb' | sed 'N;s/.../===/'
===
$ echo $'a\nb' | sed 'N;s/.../===/m'
a
b


数字のオプションは、man ed の s コマンドの所には書いてある。vim/ex の s コマンドでは使えないようだ。
m は、PerlRuby等の正規表現の m オプションとは逆だが、これは元々の sed の機能が改行文字を対象にしていたからだろう。そういった意味では、大文字の M と書いた方が誤解されないだろう。そのために大文字も同じ機能だとすると、深い。