我想在忽略某些命令的情况下运行 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 等效项)。但是用字符串?
如果您
sed
能够使用非标准-E
选项来理解扩展正则表达式,您可以使用替换为通常支持
|
的类型的基本正则表达式不支持的扩展正则表达式功能。sed
上面的
sed
命令将替换三个给定字符串中的任何一个,即使它们作为其他字符串的子字符串出现(例如string1
instring10
)。为了防止这种情况,还要匹配两边的单词边界:
在 macOS 上,您可能希望使用
[[:<:]]
and[[:>:]]
代替\<
并\>
指定单词边界。顺便说一句,您的
s/[a|b|m]/x/g
表达式(现在在问题中更正了)不仅会替换a
,b
和m
with ,x
而且还会用 . 替换|
文本中的任何内容x
。这与s/[abm|]/x/g
ory/abm|/xxxx/
或tr
命令tr 'abm|' 'xxxx'
and相同tr 'abm|' '[x*4]'
。这是你想要的?使用 GNU
sed
:POSIXly,您可以使用
awk
:(
sed -E
可能会在 POSIX 标准的下一个主要版本中指定,因此它最终可能会传播到大多数实现中)。