0

我的情况是:

  1. 我有一个很长的文本字符串,其中包含特殊字符,它出现在各种文件的长行中。包含该字符串的文件遍布整个文件系统 (Linux)。该字符串可能位于它出现的文件中的不同行号上,但每个文件出现一次。但是,该字符串包含一个特定的模式,我可以键入它来识别整个字符串。

  2. 我知道如何通过使用 GREP -lir mystringprefix /path 键入字符串的“前缀”来查找包含该字符串的文件的名称。

  3. 我知道如何使用 grep -n "prefix" file.name | 使用 GREP 和 SED 确定文件中字符串的行号 sed -n "s/^([0-9] )[:]. /\1/p”。

  4. 我知道如何使用 SED 使用 sed -i xd /path/file 删除文件中包含感兴趣字符串的行(x 是要删除的行号)。

我的问题是如何将所有这些放在一起以确定哪些文件包含该模式,将名称传递给 GREP 以确定文件中的行号,然后将名称和行号都传递给 SED 以删除该行?

我需要这样做,以便从文件系统中的某个位置开始,然后递归搜索/删除它。

谢谢你。

4

2 回答 2

2

很简单:

for file in "$(grep -lir 'prefix' /path/)" ; do
    sed -ibk -e '/prefix/d' "$file"
done

我们假设grep -lir prefix /path/返回一个以换行符分隔的文件名列表,并且您的前缀模式也是sed可以理解的。

我不需要在这里确定行号,因为我告诉sed要找到匹配的行prefix并直接删除它们。然而,该for file in "$(grep ...)"构造有点不安全,因为攻击者可以制作一个文件名,导致它做一些你意想不到的事情。最好说:

grep -lir 'prefix' /path/ --null | while IFS= read -r -d '' file ; do
    sed -ibk -e '/prefix/d' "$file"
done

尽管请注意,在while循环主体中分配的变量将无法生存。

于 2012-04-04T11:36:28.630 回答
0

模式区分大小写

grep -Zlr 'mystringprefix' /path/ | xargs -0 sed -i '/mystringprefix/d'
于 2017-03-27T23:17:04.930 回答