【问题标题】:How to remove multiple lines in multiple files on Linux using bash如何使用 bash 在 Linux 上删除多个文件中的多行
【发布时间】:2013-03-11 18:44:11
【问题描述】:

我正在尝试从我的 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

这两行连续如下:

;变量

O0l='=sTKpUG

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

【问题讨论】:

  • 您的sed 命令是什么意思?我无法理解。
  • 在这种情况下,awk 可能是比sed 更好的选择。我通常发现awk 在处理多行类型的情况时更容易使用,就像您在这里看到的那样。它可能会更冗长一些,但很多更容易理解。

标签: linux bash replace sed find


【解决方案1】:

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

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

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

由于 sed 逐行处理输入文件,它不会将换行符 '\n' 存储在其缓冲区中,因此我们需要通过使用标志 /N 来告诉它附加下一行,并带有换行符。

/^;var/N;

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

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

【讨论】:

  • 差不多就是这样,只是你使用的模式与我使用的模式不同,我仍然收到错误:未终止的地址正则表达式
  • @user920840 哎呀,我编辑了命令,你能检查它是否有效吗?
  • 我仍然收到错误 - sed: -e expression #1, char 300: unknown command: `8'
  • 第二行有大约 1600 个字符并且我将整个命令从记事本粘贴到腻子这一事实有什么不同吗?
  • 您不必将整行粘贴到命令中,只需输入足够的字符以确保只有您要删除的行与模式匹配。您可以直接运行命令,而无需关心其余行是什么。
【解决方案2】:

目前还不清楚这两行是什么样的,也不清楚它们在 JavaScript 中是否彼此相邻,所以我们假设不是。然而,答案很可能是:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2015-04-24
    相关资源
    最近更新 更多