一部のコマンドは特権が必要なため、無視してシェルスクリプトを実行したいのですが。 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相当)。しかし、ひもで?
sed
が非標準の-E
オプションを使用して拡張正規表現を理解できる場合は、
sed -E 's/string1|string2|string3/true/g'
|
による代替は、sed
が通常サポートするタイプの基本的な正規表現ではサポートされない拡張正規表現機能です。
上記のsed
コマンドは、指定された3つの文字列が他の文字列のサブ文字列(string1
のstring10
など)として発生した場合でも、それらを置き換えます。
それを防ぐには、どちらかの側のWord境界も一致させます。
sed -E 's/\<(string1|string2|string3)\>/true/g'
余談ですが、s/[a|b|m]/x/g
式(質問では修正済み)は、a
、b
、m
をx
に置き換えるだけでなく、テキスト内の|
もx
に置き換えます。これは、s/[abm|]/x/g
またはy/abm|/xxxx/
、またはtr
コマンドtr 'abm|' 'x'
と同じです。
これはあなたが探しているものですか? GNU sed
:
sed -E 's/(command1|command2|command3)/true/' file
POSIXlyでは、awk
を使用できます。
awk '{gsub(/command1|command2|command3/, "true"); print}' < file
( sed -E
はPOSIX標準の次のメジャーで指定される可能性があります ただし、最終的にはほとんどの実装に広がる可能性があります)。