用另一个字符串替换许多字符串

Edu*_*ani 6 sed text-processing regular-expression

我想在忽略某些命令的同时运行 shell 脚本,因为它们需要特权。像这样的命令insmod。所以我用这个过滤脚本,它可以工作(这些命令被替换为true):

sed -e 's/command1/true/g' -e 's/command2/true/g' -e 's/command3/true/g' ... -e 's/commandN/true/g'
Run Code Online (Sandbox Code Playgroud)

有没有更简洁的表达方式?

使用简单的字符,要将 'a'、'b' 和 'm' 更改为 'x',我可以执行以下操作:

sed -e 's/[abm]/x/g'
Run Code Online (Sandbox Code Playgroud)

或者

tr abm x
Run Code Online (Sandbox Code Playgroud)

(或其tr abm '[x*]'POSIX 等价物)。但是用字符串?

Kus*_*nda 6

如果您sed能够使用非标准-E选项来理解扩展的正则表达式,您可以使用

sed -E 's/string1|string2|string3/true/g'
Run Code Online (Sandbox Code Playgroud)

与通常支持|的类型的基本正则表达式不支持的扩展正则表达式功能sed

sed上面的命令将替换三个给定字符串中的任何一个,即使它们作为其他字符串的子字符串出现(例如string1in string10)。

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

sed -E 's/\<(string1|string2|string3)\>/true/g'
Run Code Online (Sandbox Code Playgroud)

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


顺便说一句,你的s/[a|b|m]/x/g表达(现在的问题修正)将不仅取代abmx也将取代任何|与文本x。这与s/[abm|]/x/gory/abm|/xxxx/tr命令tr 'abm|' 'xxxx'和 相同tr 'abm|' '[x*4]'