如何使用bash删除Linux上多个文件中的多行

时间:2013-03-22 01:52:01

标签: linux bash replace sed find

我正在尝试从我的Linux共享主机上的所有Javascript文件中删除2行。我想在不编写脚本的情况下执行此操作,因为我知道这应该可以使用sed。我目前的尝试看起来像这样:

find . -name "*.js" | xargs sed -i ";var 
O0l='=sTKpUG"

第二行实际上比这长,但是是恶意代码所以我没有把它包含在这里。正如您猜测我的服务器已被黑客攻击所以我需要清理所有这些JavaScript文件。

我忘了提到我目前得到的输出是:

sed: -e expression #1, char 4: expected newer version of sed

这两行连续如下:

; VAR

O0l ='= sTKpUG

除了第二行更长,但第二行的其余部分不应影响命令。

2 个答案:

答案 0 :(得分:2)

他的意思是删除两条相邻的线。

你可以这样做,记得备份你的文件。

find . -name "*.js" | xargs sed  -i -e "/^;var/N;/^;var\nO0l='=sTKpUG/d"

由于sed进程逐行处理输入文件,因此它不会在其缓冲区中存储换行符'\ n',因此我们需要使用flag / N来追加下一行,并带有换行符。

/^;var/N;

然后我们进行模式搜索和删除。

/^;var\nO0l='=sTKpUG/d

答案 1 :(得分:0)

目前还不清楚两条线是什么样的,并且不清楚它们是否在JavaScript中彼此相邻,所以我们假设没有。但是,答案可能是:

find . -name "*.js" |
xargs sed -i -e '/^distinctive-pattern1$/d' -e '/^alternative-pattern-2a$/d'

使用单个命令字符串编写sed脚本还有其他方法;我更喜欢为单独的操作使用单独的参数(它使脚本更清晰)。

显然,如果您需要在其中一行上保留一些信息,可以使用适当调整的搜索模式,然后替换s/short-pattern//而不是d来删除必须删除的短节。与长线类似,如果那是相关的。