Category Archives: 4-2.正規表現

sedの拡張正規表現を使う

今回は、sedです。

1000〜9999までの数字をランダムに30個抽出したファイルを使います。

takk@deb9:~/tmp$ seq 1000 9999 | shuf | head -30 | pr -t5J | tee a
1233    2809    2248    3144    6960
1841    8739    5148    6306    2557
8404    6340    1015    3700    5220
3669    1194    1228    6249    3955
5802    9275    7075    1219    6483
9998    3263    7148    8925    5944
takk@deb9:~/tmp$

sedで、5000番台の数字に括弧をつける場合、このような正規表現を使うと思います。

takk@deb9:~/tmp$ sed 's/\(5[[:digit:]]\{3\}\)/[\1]/' a
1233    2809    2248    3144    6960
1841    8739    [5148]  6306    2557
8404    6340    1015    3700    [5220]
3669    1194    1228    6249    3955
[5802]  9275    7075    1219    6483
9998    3263    7148    8925    [5944]
takk@deb9:~/tmp$

毎度この正規表現が見づらいなあと思うんです。
sedのよさって、オプションとかクォートとか省略できるところだから、
たとえば、2行目だけを2行表示しようと思ったら、

takk@deb9:~/tmp$ sed 2p a
1233    2809    2248    3144    6960
1841    8739    5148    6306    2557
1841    8739    5148    6306    2557
8404    6340    1015    3700    5220
3669    1194    1228    6249    3955
5802    9275    7075    1219    6483
9998    3263    7148    8925    5944
takk@deb9:~/tmp$

とても簡単です。それなのに、いざ正規表現を使おうとすると、
まあ、古めかしい仕様に則ってるので、バックスラッシュがやたらと必要になり、もうどこを見ているかわからなくなる時があります。
なので私は仕事で正規表現を使うときは、なるべくPerlを使うようにしてますが、どうしてもsedじゃないと困る時は、-rオプションに頼ります。

takk@deb9:~/tmp$ sed -r 's/(5[0-9]{3})/[\1]/' a
1233    2809    2248    3144    6960
1841    8739    [5148]  6306    2557
8404    6340    1015    3700    [5220]
3669    1194    1228    6249    3955
[5802]  9275    7075    1219    6483
9998    3263    7148    8925    [5944]
takk@deb9:~/tmp$

sedに-rオプションをつけ、拡張正規表現になり、だいぶ見やすくなりました。

でもやはりPerlの見やすさには敵わないと思います。

takk@deb9:~/tmp$ perl -pe 's/(5\d\d\d)/[$1]/' a
1233    2809    2248    3144    6960
1841    8739    [5148]  6306    2557
8404    6340    1015    3700    [5220]
3669    1194    1228    6249    3955
[5802]  9275    7075    1219    6483
9998    3263    7148    8925    [5944]
takk@deb9:~/tmp$

スラッシュが見づらければ、他の記号に変えられるところ、これが一番好きなところです。

takk@deb9:~/tmp$ perl -pe 's.(5\d\d\d).[$1].' a
1233    2809    2248    3144    6960
1841    8739    [5148]  6306    2557
8404    6340    1015    3700    [5220]
3669    1194    1228    6249    3955
[5802]  9275    7075    1219    6483
9998    3263    7148    8925    [5944]
takk@deb9:~/tmp$