【发布时间】:2011-12-18 09:37:03
【问题描述】:
有人可以帮我运行下面的命令吗?我也试图逃避单引号,但没有运气。
perl -pi.bak -e 's/Object\.prototype\.myString='q'//' myfile.html
【问题讨论】:
有人可以帮我运行下面的命令吗?我也试图逃避单引号,但没有运气。
perl -pi.bak -e 's/Object\.prototype\.myString='q'//' myfile.html
【问题讨论】:
问题不在于 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 代码中常见的许多字符,如 $、! 和 \,具有特殊含义即使在双引号内也可以到 shell。
当然,另一种解决方案是将正则表达式中的单引号替换为八进制或十六进制代码 \047 或 \x27:
$ perl -pi.bak -e 's/Object\.prototype\.myString=\x27q\x27//' myfile.html
【讨论】:
\x27 的推荐似乎是最简单可靠的——效果很好!
双引号应该可以:
perl -pi.bak -e "s/Object\.prototype\.myString='q'//" myfile.html
您可能想要也可能不想要该正则表达式上的 g 修饰符。您可能需要在之后执行diff 以确保您没有破坏 HTML。
【讨论】: