1つの表現を使用して複数の針を1つの単語で検索および置換する方法


8

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

foo fnord bar
bizz foo poit

そして今、「foo」と「bar」の両方を「narf」に置き換えたいと思います。

私は使用できることを知っています:

 sed -e 's/foo/narf/g' -e 's/bar/narf/g' fileName

それでも、1つの式で両方の針に一致するように正規表現に指示するOR演算子を使用したいと思います。

いくつかのマニュアルを読んで、パイプは自分のニーズに合うはずだと思いますが、試しました

sed -e 's/foo|bar/narf/g' -i fileName

そしてそれは機能せず、エラーをスローすることすらありません。

ここで何が悪いのですか?

回答:


10

-r拡張正規表現構文のオプションを使用:

sed -r -e 's/foo|bar/narf/g'

それ以外の場合は、選言をエスケープし\|ます。

sed -e 's/foo\|bar/narf/g'

6

正規表現の構文には多くのバリエーションがあります。正規表現を備えたUNIXの世界で最初のツールには、正規表現のすべての機能がありませんでした。文字セット([…]および.)、繰り返し(*)および行アンカー(^および$)のみがありました。基本的な正規表現には、これらの演算子しかありません。Sedは昔ながらのツールであり、基本的な正規表現を使用しています。

多くのsed実装には、完全な正規表現マッチングのための拡張機能があります。文字があるので|、それ自体を意味し、あなたが使用する必要が\|交代のために、同様に\(して\)グループ化するため。POSIX標準\|基本的な正規表現でサポートされることを義務付けておらず、一部のシステム(OpenBSDなど)ではサポートされていないことに注意してください。

sedの一部のバージョンでは、に切り替えるオプション持っている拡張正規表現(…)グループ化するために、使用された|交替のために。GNU sed(つまり、LinuxまたはCygwin)またはBusyboxでは、-rオプションを渡します。上のFreeBSDOSX、渡す-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

0

VimはExモードで使用できます。

ex -sc '%s/\vPA|QU/RO/g|x' file
  1. % すべての行を選択

  2. s 代替

  3. \v 魔法をかける

  4. g グローバル置換

  5. x 保存して閉じます

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