删除不同文件中包含指定字符串的行

删除不同文件中包含指定字符串的行

假设web/namedfoo.phpbar.php.第一行foo.php是“sdajgeSTRINGdsad”,第十行bar.php是“gdfhu98324STRING”。任务是首先找到这两个文件,然后删除 foo.php 的第 1 行和 bar.php 的第 10 行,因为指定的字符串是“STRING”。

答案1

sed可以这样做:

sed -i.bak '/STRING/d' web/*

答案2

要查找包含字符串的文件,请使用grep.如果您想查找哪些文件web/及其所有子目录中包含 STRING:

grep -R“STRING”网络/

要编辑文件并删除包含字符串的行,有很多选项,但这里有两个常见选项。由于您想对整行进行操作,这非常简单:)

首先,您可以使用grep参数-v来反向搜索并隐藏输出中的匹配行而不是显示它们。对于您的第一个文件,我们使用sponge。这将使我们能够读取您的文件,对其进行过滤,然后将其写回到同一个文件中,这一切都在一个动作中:

grep -v "sdajgeSTRINGdsad" foo.php | sponge foo.php

对于第二个示例,我们将使用 执行相同的操作grep,但如果您没有,sponge可以将其写入不同的文件,然后将该文件移回原始名称:

grep -v "gdfhu98324STRING" bar.php  > bar.php.cleaned
mv bar.php{.cleaned,}

sed第二种方法是与d行删除命令一起使用。对于您的第一个示例,我们将使用就地文件编辑以及创建.bk备份文件的选项:

sed -i.bk '/sdajgeSTRINGdsad/d'  foo.php

通过自己复制文件,然后使用 sed 过滤备份并覆盖原始文件,可以完成几乎相同的事情:

cp bar.php bar.php.bk
sed '/gdfhu98324STRING/d' bar.php.bk > bar.php

现在将这两个任务结合起来!让我们创建一个函数,以便您可以使用不同的字符串重复执行此操作:

function nuke_string () {
    string="$1"
    path="$2"
    grep -R -l "$string" "$path" | while IFS= read -r file; do
        sed -i.bk "/$string/d" "$file"
    done
}

创建该函数后,您可以像这样使用它:

nuke_string "STRING" web/

web/ 中包含 STRING 的任何文件都将删除这些行,并由原始版本制作备份副本。您可以在当前 shell 中创建这样的函数,也可以将其写入.bashrc文件并使其始终可用。

答案3

grep -l只需与 一起使用即可-R!这是一个完整的单行:

grep -Rl "STRING" web/ | xargs sed -i "/STRING/d"

答案4

您可以在 Ex 模式下使用 Vim:

for k in web/*.php
do
  ex -sc '/STRING/d|x' "$k"
done
  1. d删除

  2. x保存并关闭

相关内容