![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.3ベストアンサー
- 回答日時:
伝統的には、grep コマンドでつかうのが「正規表現」、egrep コマンドで使うのが「拡張正規表現」で、Perl等のは拡張正規表現のさらに拡張になってます。
すでに出ているように、( | ) { } 等が文字そのままの意味なのか正規表現の特殊文字なのかの切り替えに \ をつけるかつけないかなどが違います。
ここにまとめられています。
http://www.kt.rim.or.jp/~kbk/regex/regex.html
No.4
- 回答日時:
> これは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自体にしても
バージョンによって拡張されている範囲に違いがあったり、
独自の拡張が加えられていたりするので使うときには注意が必要です。
No.2
- 回答日時:
> bash-3.2$ sed 's/^\([0-9]+\):\([0-9]+\)/^\2:\1/g' test
> 1111:2222:3333:4444
> 5555:6666:7777:8888
>
> とやってみたのですが、まだうまくいきません。
あー(笑)
sed は + も使えません。
ただし、GNU sed だったら \+ と書くことでPerlの+と
同じ意味にすることができます。
あと、置換パターンの先頭にある ^ は何のために?
もうひとつgフラグもいらないんじゃ?
ありがとうございます。
得たい結果を得ることができました。
bash-3.2$ sed 's/^\([0-9]\{4\}\):\([0-9]\{4\}\)/\2:\1/' test
2222:1111:3333:4444
6666:5555:7777:8888
これはsedで正規表現を使う場合、記号はエスケープする必要が
あるということでしょうか?
またsedで使える正規表現とperlで使える正規表現がちがうと
思うのですがperlの正規表現の表記が特殊ということでしょうか?
No.1
- 回答日時:
Perlの正規表現を使って書いちゃってますね。
GNU sedの新しいのだとオプション指定でPerl表記の正規表現を
受け付けるようにできますが、ふつーのsedはそんなことはできません。
\d は使えません → [0-9] を使用
後方参照で使うためのカッコは ( ) ではなく \( \) です
回数指定のブレースは、\を前置します。
置換文字列の中で後方参照をするときに使うのは $ ではなく \ です。
あえて答えそのものは書きませんので試してみてください。
ありがとうございます。
Perlだけで使える文法だったんですね。
bash-3.2$ sed 's/^\([0-9]+\):\([0-9]+\)/^\2:\1/g' test
1111:2222:3333:4444
5555:6666:7777:8888
とやってみたのですが、まだうまくいきません。
難しいですね。><
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- UNIX・Linux sedでの正規化 2 2022/05/10 11:39
- その他(プログラミング・Web制作) sedの動作 2 2022/10/10 13:38
- その他(プログラミング・Web制作) sedの正規表現 1 2022/10/08 18:57
- Excel(エクセル) Excel セルに入っている日付を参照して、別シートのリストを表示させたい 1 2022/04/12 17:02
- Excel(エクセル) エクセルでセルの日付を和暦表示設定にしたらおかしなことに? 3 2022/05/25 11:47
- Visual Basic(VBA) 【VBA】データを入力後に,同一シート内に履歴として転記するVBAコードを教えていただきたいです。 3 2022/11/16 01:37
- Excel(エクセル) Excel 表の作成について 3 2022/06/16 12:15
- Excel(エクセル) ピボットテーブルの参照式はオートフィル出来ない? 2 2023/03/03 15:57
- Excel(エクセル) Excelでなぜこのような式をつかっているのでしょうか、行に1,2,3と連番を振るだけなのに 5 2023/04/08 20:00
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メールアドレスの正規表現について
-
[VBS] テキストファイルから任...
-
文字列検索(grepのようなもの)...
-
vbaの正規表現で、マッチした一...
-
Mで始まりuで終わる文字列
-
正規表現で文字クラスの引き算
-
正規表現 秀丸エディタ 行頭か...
-
正規表現です。括弧内にある複...
-
正規表現で( , -, ] を表すと。
-
C言語のコメントを「正規表現」...
-
正規表現を使って文字列をコピー
-
<正規表現>直書きしない文字列否定
-
URLを正規表現に変換したい
-
wordの何も書かれていない2ペー...
-
PS4コントローラーをPCでゲーム...
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
EBCDIC⇒SJIS変換の方法
-
Chr(13)とChr(10)の違いは?
-
Excelで指数表現しないようにす...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正規表現 秀丸エディタ 行頭か...
-
vbaの正規表現で、マッチした一...
-
メールアドレスの正規表現について
-
[VBS] テキストファイルから任...
-
正規表現でシングルクォーテー...
-
文章中全ての半角カッコ ( の...
-
MFCで正規表現
-
[正規表現] 数字範囲をヒット...
-
Mで始まりuで終わる文字列
-
正規表現でAND検索はできる...
-
C言語にパターンマッチってない...
-
正規表現で囲まれた部分の文字列
-
正規表現です。括弧内にある複...
-
さくらエディタでGrep検索する...
-
文字列検索(grepのようなもの)...
-
正規表現で、青空文庫形式の入...
-
正規表現で一致しない(否定)場...
-
C言語のコメントを「正規表現」...
-
正規表現でカウントアップ(?)す...
-
正規表現で特定文字列の全角カ...
おすすめ情報