将许多字符串替换为另一个字符串

将许多字符串替换为另一个字符串

我想运行 shell 脚本,同时忽略某些命令,因为它们需要特权。命令如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将替换三个给定字符串中的任何一个,即使它们作为其他字符串的子字符串出现(例如string1in string10)。

为了防止这种情况,还要匹配两侧的单词边界:

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

在 macOS 上,您可能需要使用[[:<:]]and[[:>:]]代替\<and\>来指定单词边界。


顺便说一句,您的s/[a|b|m]/x/g表达式(现在在问题中已更正)不仅会替换a,b和,m而且还将文本中的x任何内容替换为。这与or或命令and相同。|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 -E很可能会在 POSIX 标准的下一个主要版本中指定不过,所以它最终可能会传播到大多数实现)。

相关内容