私は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