Perl正则表达式单引号

时间:2011-10-30 22:27:39

标签: regex perl shell

有人可以帮我运行下面的命令。我也试图逃避单引号但没有运气。

perl -pi.bak -e 's/Object\.prototype\.myString='q'//' myfile.html

2 个答案:

答案 0 :(得分:17)

问题不在于Perl,而在于你的shell。要了解发生了什么,请尝试以下方法:

$ echo 's/Object\.prototype\.myString='q'//'
s/Object\.prototype\.myString=q//

要使其正常工作,您可以使用'\''替换每个单引号,如下所示:

$ echo 's/Object\.prototype\.myString='\''q'\''//'
s/Object\.prototype\.myString='q'//

或者您可以通过以下方式保存一些字符:

$ echo 's/Object\.prototype\.myString='\'q\''//'
s/Object\.prototype\.myString='q'//

甚至只是:

$ echo 's/Object\.prototype\.myString='\'q\'//
s/Object\.prototype\.myString='q'//

甚至:

$ echo s/Object\\.prototype\\.myString=\'q\'//
s/Object\.prototype\.myString='q'//

双引号(suggested by mu is too short)也适用于此处,但在其他情况下可能会产生意外的惊喜,因为Perl代码中常见的许多字符,如$!和{ {1}},即使在双引号内也对shell有特殊意义。

当然,另一种解决方案是将正则表达式中的单引号替换为八进制代码或十六进制代码\\047代替:

\x27

答案 1 :(得分:6)

双引号应该有效:

perl -pi.bak -e "s/Object\.prototype\.myString='q'//" myfile.html

您可能想要也可能不想在该正则表达式上使用g修饰符。并且您可能希望在diff之后确保您没有破坏HTML。