質問: sedで正規表現の後方参照を使いたい。 後方参照の練習をしようとしています。 1111:2222:3333:4444 5555:6666:7777:8888 というファイルを:でフィールドを区切って1列目と2列目を sedをつかってひっくり返そうとしました。 sed 's/^(\d{4}):(\d{4})/^$2:$1/' test.file などいろいろやってみたのですがうまくいきません。 良ければ教えてください。
回答: > これはsedで正規表現を使う場合、記号はエスケープする必要が > あるということでしょうか? > またsedで使える正規表現とperlで使える正規表現がちがうと > 思うのですがperlの正規表現の表記が特殊ということでしょうか? まずはじめに。 #3の方の回答にあるとおり、大きく分けると grep/sed で使われていたもの、 egrep/awk で使われていたもの、perlで使われているもの。の三つになります。 おおまかに古いほうから grep → sed → egrep → awk → perl の順です。 '*'とか'^','$' などを見てもわかるとおり、grep/sedの正規表現でも記号類すべてに'\'を つけなければメタ文字にならないということはありません。 '('とか'{'に'\'が要求されるのは、おそらくcのソースなんかを検索するときに '\'がついていない'('はメタ文字にならないほうが都合がよいからでしょう。 #という話を昔聞いたことがあります その割に '['は違ったりするのですけどね。 egrepは、grep/sedで用いられていたのとは違ったアルゴリズムで正規表現検索を 実現していました。そのため新たな別プログラムになっていたりするのですが、 なぜ '(', '{' の扱いが変わったのかはわかりません。 #aho博士に訊いてください んでperl。 posixという規格では、grep/sedの受け付ける正規表現を「基本正規表現(basic regular expression)」、 egrep/awkの受け付けるものを「拡張正規表現(extended reguar expression)」 のように分類していますが、実は拡張正規表現は基本正規表現のすべてを含んだものではありません。 斯様にごちゃごちゃしたものがありましたので、perl3か4の時点でperlの original autherであるlarry wallが ・使える正規表現は基本正規表現+拡張正規表現とし ・記号がメタ文字になる場合はそれのみでなるようにし、基本正規表現にあるような'\(' や '\{' という表記は採用しない といった規則のもとでまとめました。 そしてperl 5でいわゆるperl拡張が導入されました。 perl互換の正規表現というと、このperl 5での拡張をサポートしているかどうか で言われますが、実は言語とかライブラリによってとかperl自体にしても バージョンによって拡張されている範囲に違いがあったり、 独自の拡張が加えられていたりするので使うときには注意が必要です。