テキストファイルがあるとしましょう。
foo fnord bar
bizz foo poit
今、「foo」と「bar」の両方を「narf」に変更したいと思います。
以下が利用可能であることを知っています。
sed -e 's/foo/narf/g' -e 's/bar/narf/g' fileName
しかし、OR演算子を使用して、正規表現に2つの針を1つの式と一致させるようにしたいと思います。
いくつかのマニュアルを見て、配管が私のニーズに適していると思いましたが、試してみました。
sed -e 's/foo|bar/narf/g' -i fileName
動作せず、エラーも発生しません。
私がここで何を間違っているのか?
答え1
-r
拡張正規表現構文を使用するオプション:
sed -r -e 's/foo|bar/narf/g'
それ以外の場合は、次のように分離を脱出します\|
。
sed -e 's/foo\|bar/narf/g'
答え2
さまざまなバリエーションがあります正規表現通事論。 Unixの世界で正規表現を使用する最初のツールには、正規表現のすべての機能がなく、文字セット(および[…]
).
、反復(*
)、および行アンカー(^
および$
)のみがありました。基本正規表現このような演算子だけがあります。 Sed はデフォルトの正規表現を使用する古いツールです。
多くのsed実装には、完全正規表現一致のための拡張機能があります。文字は自分自身を表しているため、シフト|
に使用する必要があり、グループ化にも同様に使用する必要があります。ご注意ください、\|
\(
\)
POSIX規格\|
サポートは不要基本正規表現、いくつかのシステム(例:オープンBSD)なし。
sed の一部のバージョンには、次に切り替えるオプションがあります。拡張正規表現、(…)
グループ化、シフト|
に使用されます。 GNU sed(LinuxやCygwinなど)を使用する忙しい箱、-r
オプションの配信。存在するFreeBSDまたはOSX、-E
オプションの配信。
sedが交互にならない場合に電話することができますawk
。出身ですPOSIXただし、この操作では少し冗長で、逆参照をサポートしていません。
awk '{gsub(/foo|bar/, "narf")}' <fileName.old >fileName.new
ちなみに、GNUとBusybox sedだけがファイル内部の置換をサポートしています。 awkとは異なるバージョンのsedはそうではありません。バラよりファイルを所定の位置から「切り取り」に変更できますか?
Perlを使用している場合は、通常、すべてのツールサイズに合わせて1行のテキストを便利に処理します。 sed、awkなどの簡単な作業のほとんどはPerlでは難しくなく、単一の(複雑な場合)ツールだけを学ぶことで問題を解決できます。
perl -i -pe 's/foo|bar/narf/g' fileName
答え3
ExモードでVimを使用できます。
ex -sc '%s/\vPA|QU/RO/g|x' file
%
すべての行を選択s
変える\v
魔法をかけるg
グローバル交換x
保存して閉じる