多くの文字列を他の文字列に置き換える

多くの文字列を他の文字列に置き換える

権限を必要とする特定のコマンドを無視してシェルスクリプトを実行したいと思います。コマンドは次のとおりです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コマンドと同じです。|xs/[abm|]/x/gy/abm|/xxxx/trtr '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 -EPOSIX規格の次のメジャーバージョンで指定される可能性が高いです。しかし、最終的にはほとんどの実装に広がります。

関連情報