私はsedを使用しています、GNU sedバージョン4.2.1。 「|」を使いたい部分式の中のシンボル。例えば :
echo "blia blib bou blf" | sed 's/bl\(ia|f\)//g'
戻るべき
" blib bou "
しかしそれは戻る
"blia blib bou blf".
どうすれば期待どおりの結果が得られますか?
「|」その特別な意味を得るためにはバックスラッシュも必要です。
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
の変種があり、それらは異なる動作をします。
Gnu以外のsed
の実装に関するいくつかのコメントがあるので:少なくともOS Xでは、sed
に-E
引数を使うことができます。
正規表現を基本正規表現(BRE)ではなく拡張(現代)正規表現として解釈します。 re_format(7)マニュアルページは両方のフォーマットを完全に説明しています。
そうすれば、エスケープせずに正規表現メタ文字を使用できます。例:
$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
blib bou
GNU sedは-r
オプション(拡張正規表現)もサポートしています。これは、メタキャラクタをエスケープする必要がないことを意味します。
echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"
出力:
hi hi
\|
はSolaris 10上のsedでも動作しません。私がしたことは使用でした
Perl -p -e 's/bl(ia|f)//g'
フォローアップ:sed -EはMacOSでそれを可能にします。 |のためのバックスラッシュは不要です。
sed -E 's/this|orthat/oooo/g' infile
Windows上のGnuWin32では、構文はsed "s/thing1\|thing2/ /g" source > destination
です。
引用符は"
型である必要があります - これは、コマンドを解析するためには「必須」です。