我有两个Perl一个衬垫:
perl -pe "s/\b$a\b/$b/g if m/param1 /" test
和
perl -pe "s/\b$a\b/$b/g unless /^#/" test
如何合并if m/somthing/
和unless /something/
,例如:
[root@localhost tmp]# perl -pe "s/\b$a\b/$b/g if m/param1/ unless /^#/" test
syntax error at -e line 1, near "m/param1/ unless"
答案 0 :(得分:3)
也许
perl -pe "s/\b$a\b/$b/g if m/param1/ && ! /^#/" test
做到了。
答案 1 :(得分:2)
unless
与if not
相同。根据您撰写声明的方式判断,我猜您的意思如下:
perl -pe "s/\b$a\b/$b/g if m/param1/ and not /^#/" test
(虽然,您可能需要or
代替and
?)
答案 2 :(得分:0)
在不相关的注释中,您可能希望在正则表达式$a
周围添加\Q
and \E
转义序列:
perl -pe "s/\b\Q$a\E\b/$b/g if m/param1 /" test
它们会转义任何对正则表达式特殊的字符。如果您打算$a
持有正则表达式,您应该将单词边界断言(\b
)移入其中。
无论您选择做什么,都需要注意$a
和$b
中的值。例如:
a="/"
b="slash"
perl -pe "s/\b\Q$a\E\b/$b/g if m/param1 /" test
会导致语法错误。对此的一个解决方案是不使用环境变量来替换代码。 Perl允许您通过%ENV
哈希访问环境:
perl -pe 's/\b\Q$ENV{a}\E\b/$ENV{b}/g if m/param1 /' test
注意使用单个刻度来避免将$ENV
视为shell变量。