sed の正規表現での代替”|”の使用

regex sed

私はsed, GNU sed version 4.2.1を使用しています。subexpressionの中で交互に “|” 記号を使いたいのですが。例えば、以下のようになります

echo "blia blib bou blf" | sed 's/bl\(ia|f\)//g'

should return

" blib bou "

を返しますが

"blia blib bou blf".

どのようにして期待される結果を得ることができますか?

  84  None  2010-02-22


ベストアンサー

また、「|」には特別な意味を持たせるためにバックスラッシュが必要です

echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'

は、あなたが望むことをしてくれるでしょう

ご存知のように、他のすべてが失敗した場合は、マニュアルを読んでください。)

GNU sed ユーザマニュアル、3.3 正規表現構文の概要 セクション

`REGEXP1\|REGEXP2′

REGEXP1またはREGEXP2のいずれかにマッチします

バックスラッシュに注意してください

残念ながら、正規表現の構文は標準化されていません… 多くのバリエーションがあり、どの “特殊文字 “が \ を必要とし、どの “特殊文字 “が不要なのかが他のものの中で異なっています。いくつかでは、それは設定可能であったり、スイッチに依存していたりします (GNU grep のように、三つの異なる正規表現を切り替えることができます)

この答えは、特に GNU sed のためのものです。BSDで使われているものなど、他のsedの変種もありますが、それらは異なった挙動をします

112  sleske  2010-02-22


Gnu以外のsed実装に関するコメントがいくつかあるので少なくともOS Xでは、sed-E引数を使うことができます

正規表現は、基本的な正規表現 (BRE’s) ではなく、拡張された (現代的な) 正規表現として解釈します。re_format(7) のマニュアルページでは、両方のフォーマットについて完全に説明しています

そうすると、正規表現のメタキャラクタをエスケープせずに使うことができます。例を挙げてみます

$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
blib bou

26  Daniel Beck  2013-05-28


GNU sed は -r オプション (拡張正規表現) もサポートしています。これはメタキャラクタをエスケープする必要がないことを意味します

echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"

Output:

hi hi

14  jco  2014-02-18


Solaris 10でもsedでは\|は動作しません。私が使ったのは

perl -p -e 's/bl(ia|f)//g'

9  Joe Tennies  2013-05-28


続いて: sed -E は MacOS で使用できる。のバックスラッシュは必要ない

 sed -E 's/this|orthat/oooo/g' infile

4  some ideas  2013-08-28


Windows上のGnuWin32のsedでは、構文はsed "s/thing1\|thing2/ /g" source > destinationです

引用符のタイプは " でなければなりません – これはコマンドを解析するために “必須 “です

1  twobob  2016-02-18


タイトルとURLをコピーしました