今回は、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$
コメント