我想运行 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
将替换三个给定字符串中的任何一个,即使它们作为其他字符串的子字符串出现(例如string1
in string10
)。
为了防止这种情况,还要匹配两侧的单词边界:
sed -E 's/\<(string1|string2|string3)\>/true/g'
在 macOS 上,您可能需要使用[[:<:]]
and[[:>:]]
代替\<
and\>
来指定单词边界。
顺便说一句,您的s/[a|b|m]/x/g
表达式(现在在问题中已更正)不仅会替换a
,b
和,m
而且还将文本中的x
任何内容替换为。这与or或命令and相同。|
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 标准的下一个主要版本中指定不过,所以它最终可能会传播到大多数实现)。