rcmdnk's blog

詳説 正規表現 第3版

GNU/BSDでのコマンドの違いについて。

今回はsedコマンドの正規表現の取り扱いについてのメモ。

sedでの正規表現

LinuxにもMacなどBSD系Unixにもsedは入ってますが、 他のコマンドにもあるように GNUのものとBSDのものとでオプション等が多少違います。

前に-iを使ったファイルの置き換えにおける違い改行の仕方 について挙げましたが、 今回は正規表現について。

GNU

GNU版sedだと、正規表現で使う文字をバックスラッシュ(\) でエスケープすることで特にオプションを付けずに使う事が出来ます。

$ echo aaabbbccc | sed 's/aaa\(BBB\|bbb\)ccc/aaaccc/g'
aaaccc

BBBbbbの何れかの文字列に対応する(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
Sponsored Links

« Pythonで大きなファイルのMD5チェックサムをチェックする時にMemoryErrorを回避する HomebrewにFormulaを公式に入れてもらうためにチェックする事 »