web-dev-qa-db-ja.com

多くの文字列を別の文字列で置き換える

一部のコマンドは特権が必要なため、無視してシェルスクリプトを実行したいのですが。 insmodのようなコマンド。だから私はこれでスクリプトをフィルタリングし、それが機能します(これらのコマンドはtrueに置き換えられます):

sed -e 's/command1/true/g' -e 's/command2/true/g' -e 's/command3/true/g' ... -e 's/commandN/true/g'

それを表現するより簡潔な方法はありますか?

単純な文字を使用して、「a」、「b」、および「m」を「x」に変更するには、次のようにします。

sed -e 's/[abm]/x/g'

または

tr abm x

(またはそのtr abm '[x*]' POSIX相当)。しかし、ひもで?

6

sedが非標準の-Eオプションを使用して拡張正規表現を理解できる場合は、

sed -E 's/string1|string2|string3/true/g'

|による代替は、sedが通常サポートするタイプの基本的な正規表現ではサポートされない拡張正規表現機能です。

上記のsedコマンドは、指定された3つの文字列が他の文字列のサブ文字列(string1string10など)として発生した場合でも、それらを置き換えます。

それを防ぐには、どちらかの側のWord境界も一致させます。

sed -E 's/\<(string1|string2|string3)\>/true/g'

余談ですが、s/[a|b|m]/x/g式(質問では修正済み)は、abmxに置き換えるだけでなく、テキスト内の|xに置き換えます。これは、s/[abm|]/x/gまたはy/abm|/xxxx/、またはtrコマンドtr 'abm|' 'x'と同じです。

5
Kusalananda

これはあなたが探しているものですか? GNU sed

sed -E 's/(command1|command2|command3)/true/' file

POSIXlyでは、awkを使用できます。

awk '{gsub(/command1|command2|command3/, "true"); print}' < file

sed -EはPOSIX標準の次のメジャーで指定される可能性があります ただし、最終的にはほとんどの実装に広がる可能性があります)。

0