1つの表現で複数の針を見つけて置き換える方法は?

1つの表現で複数の針を見つけて置き換える方法は?

テキストファイルがあるとしましょう。

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
  1. %すべての行を選択

  2. s変える

  3. \v魔法をかける

  4. gグローバル交換

  5. x保存して閉じる

関連情報