sedでの正規表現
LinuxにもMacなどBSD系Unixにもsedは入ってますが、
他のコマンドにもあるように
GNUのものとBSDのものとでオプション等が多少違います。
前に-iを使ったファイルの置き換えにおける違い や 改行の仕方 について挙げましたが、 今回は正規表現について。
GNU
GNU版sedだと、正規表現で使う文字をバックスラッシュ(\)
でエスケープすることで特にオプションを付けずに使う事が出来ます。
$ echo aaabbbccc | sed 's/aaa\(BBB\|bbb\)ccc/aaaccc/g'
aaaccc
BBBとbbbの何れかの文字列に対応する(BBB|bbb)という正規表現を使ってます。
部分をくくるための括弧やorを表現する|に対して
バックスラッシュでエスケープして使っています。
エスケープしなければまっちしないのでそのまま。
$ echo aaabbbccc | sed 's/aaa(BBB|bbb)ccc/aaaccc/g'
aaabbbccc
また、GNUでは-rオプションを使うと正規表現をそのまま使える様になります。
$ echo aaabbbccc | sed -r 's/aaa(BBB|bbb)ccc/aaaccc/g'
aaaccc
この時はエスケープするとその文字はその文字、として判断されるので逆にマッチしなくなります。
$ echo aaabbbccc | sed -r 's/aaa\(BBB\|bbb\)ccc/aaaccc/g'
aaabbbccc
BSD
BSDの場合はエスケープの方法は使えません。
$ echo aaabbbccc | sed 's/aaa\(BBB\|bbb\)ccc/aaaccc/g'
aaabbbccc
BSDの場合には-Eというオプションが正規表現を使う拡張オプションになります。
$ echo aaabbbccc | sed -E 's/aaa(BBB|bbb)ccc/aaaccc/g'
aaaccc
まとめ
- GNU sedでの正規表現:
- バックスラッシュでエスケープすると正規表現として使う事が出来る。
-rオプションを使うと正規表現文字をそのまま解釈するようになる。
- BSD sedでの正規表現:
- バックスラッシュでのエスケープは正規表現として解釈しない。
-Eオプションを使うと正規表現文字をそのまま解釈するようになる。
と言った感じ。
sedにはこれ以外にも結構色々違いがありますが、
LinuxとMac等BSDな環境両方で使う様なスクリプトがある場合は
(.bashrcとかで使ってたり)ちょっと注意が必要です。
Sponsored Links
