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


79

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

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

帰るべき

" blib bou "

しかし、それは戻ります

"blia blib bou blf".

期待される結果を得るにはどうすればよいですか?

回答:


110

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

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

あなたがしたいことをします。

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

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

`REGEXP1 \ | REGEXP2 '

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

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

残念ながら、正規表現の構文は実際には標準化されていません...「特殊文字」が\を必要とするものとそうでないものとで異なる多くのバリアントがあります。いくつかは、設定​​可能であるか、スイッチに依存しています(GNUのようにgrep、3つの異なる正規表現方言を切り替えることができます)。

特にこの回答は、GNU sed向けです。sedBSDで使用されるものなど、動作が異なる他のバリアントがあります。


35
この答えに混乱した他の人のために\ | gnu sed(os xでgsed)でのみ動作し、vanilla sed(os xでsed)では動作しません。
アンドリューハンコックス

@AndrewHancoxありがとうございます!私は頭からすべての髪を引き裂こうとしていました(そして今のところ、髪の毛の前のマネージャーと比べてかなり良いことをしています)-私はRegExを試してみるのに十分知っています。および\ | しかし、OSXが実際に非GNU sedを使用するかもしれないという事実については考えませんでした。
phatskat

8
標準BSD / OS Xのバージョンはsedサポート交代が、唯一の「拡張」正規表現構文(とない-E:パイプや括弧のどちらかにはバックスラッシュを意味しない- )echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
マーク・リード

2
回答を編集して、GNU sed専用であることに注意しました。
sleske

23

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

正規表現を、基本的な正規表現(BRE)ではなく、拡張(現代)正規表現として解釈します。re_format(7)のマニュアルページでは、両方の形式について詳しく説明しています。

その後、正規表現のメタキャラクターをエスケープせずに使用できます。例:

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

12

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

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

出力:

hi hi

はい、-rオプションは式を読みやすくするために本当に役立ちます。それは受け入れられた答えであるべきです。
рüффп

9

\|いずれかのSolaris 10上のsedでは動作しません。私がしたことは

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

2
システムにperlがある場合、sedとは異なり、常にこの構文が使用されるため、移植性のために+1。
evilsoup


1

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.