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