権限を必要とする特定のコマンドを無視してシェルスクリプトを実行したいと思います。コマンドは次のとおりです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)。しかし、文字列を使うのはどうですか?
答え1
非標準オプションを使用して拡張正規表現を理解sed
できる場合は、次を使用できます。-E
sed -E 's/string1|string2|string3/true/g'
置換は、通常、|
サポートされているタイプの基本正規表現ではサポートされていない拡張正規表現機能ですsed
。
上記のコマンドは、sed
与えられた3つの文字列の1つを置き換えます。その文字列が他の文字列の部分文字列として表示されます(例:string1
からstring10
)。
これを防ぐために、両方の単語の境界も一致させます。
sed -E 's/\<(string1|string2|string3)\>/true/g'
macOSでは、単語の境界を指定するために、代わりに[[:<:]]
および[[:>:]]
を\<
使用する必要があります。\>
ところで、あなたのs/[a|b|m]/x/g
表現(今の質問で修正されている)は、とをa
変更b
するだけでなく、m
テキストのx
すべての内容を 。これはorコマンドと同じです。|
x
s/[abm|]/x/g
y/abm|/xxxx/
tr
tr 'abm|' 'xxxx'
tr 'abm|' '[x*4]'
答え2
これはあなたが望むものですか? GNUの使用sed
:
sed -E 's/(command1|command2|command3)/true/' file
答え3
POSIXlyでは、以下を使用できますawk
。
awk '{gsub(/command1|command2|command3/, "true"); print}' < file
(sed -E
POSIX規格の次のメジャーバージョンで指定される可能性が高いです。しかし、最終的にはほとんどの実装に広がります。