web-dev-qa-db-ja.com

交互の使用 "|" sedの正規表現

私はsedを使用しています、GNU sedバージョン4.2.1。 「|」を使いたい部分式の中のシンボル。例えば ​​:

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

戻るべき

" blib bou "

しかしそれは戻る

"blia blib bou blf".

どうすれば期待どおりの結果が得られますか?

75
Cedric

「|」その特別な意味を得るためにはバックスラッシュも必要です。

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

あなたが望むことをするでしょう。

あなたが知っているように、他のすべてが失敗するなら、マニュアルを読んでください:-)。

GNU sedユーザーズマニュアル、section 3.3正規表現構文の概要

`REGEXP1\| REGEXP2 '

REGEXP1またはREGEXP2のいずれかと一致します。

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

残念ながら、正規表現の構文は実際には標準化されていません... "特殊文字"が\を必要とするものとそうでないものが異なる多くの変種があります。場合によっては設定可能なものやスイッチに依存するものもあります(GNU grepのように、3つの異なる正規表現を切り替えることができます)。

特にこの答えは GNU sed に対するものです。 BSDで使用されているものなど、他のsedの変種があり、それらは異なる動作をします。

106
sleske

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

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

そうすれば、エスケープせずに正規表現メタ文字を使用できます。例:

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

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

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

出力:

hi hi
10
jco

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

Perl -p -e 's/bl(ia|f)//g'
9
Joe Tennies

フォローアップ:sed -EはMacOSでそれを可能にします。 |のためのバックスラッシュは不要です。

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

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

引用符は"型である必要があります - これは、コマンドを解析するためには「必須」です。

1
twobob