0

将 grep 与 sed 结合使用时,只要使用标准的正斜杠分隔符,一切都可以。

find . -maxdepth 2 -xdev -type f -exec grep -i "teststring" -l {} \; -exec sed -i '/./d' {} \;

如果我将它更改为另一个字符,如“+”或“#”,它就不起作用(我需要更改它,因为测试字符串可能包含“/”字符并导致错误。

find . -maxdepth 2 -xdev -type f -exec grep -i "teststring" -l {} \; -exec sed -i '#.#d' {} \;

有没有解决这个问题?

4

5 回答 5

1

看起来您正在尝试清空任何包含 teststring 的文件。那只是:

find . -maxdepth 2 -xdev -type f | 
while IFS= read -r file; do
   if grep -i "teststring" -q "$file"; then
      > "$file"
   fi
done

如果您只想删除那些至少包含一个字符的行,那就是:

find . -maxdepth 2 -xdev -type f | 
while IFS= read -r file; do
   if grep -i "teststring" -q "$file"; then
      sed -i '/^./d' "$file"
   fi
done

如果你想删除那些包含一些字符串“foo”的行,那么那就是:

find . -maxdepth 2 -xdev -type f | 
while IFS= read -r file; do
   if grep -i "teststring" -q "$file"; then
      sed -i '/foo/d' "$file"
   fi
done

只需遵循该模式,假设您没有包含换行符的文件名,您想做的任何事情都是微不足道的。如果您愿意,您可以将 grep 移到查找行中,但这似乎有点毫无意义并且会混淆代码。

于 2012-12-13T18:19:19.777 回答
1

您需要反斜杠第一个分隔符

有时用于 sed(例如,OSX)的 BSD 手册页并没有说清楚,但是只有在 RE 前面有反斜杠时,对 sed 正则表达式地址使用任意分隔符才有效。

\xMATCHTHISxd

这将删除有MATCHTHIS某处的行。

于 2012-12-13T17:30:49.517 回答
1

根据sed 的手册页,任何字符都可以用作匹配正则表达式的行,语法为\cregexpcwhere cis any character。

find . -maxdepth 2 -xdev -type f -exec grep -i "teststring" -l {} \; -exec sed -i '\#.#d' {} \;
于 2012-12-13T17:25:45.960 回答
1

如果要在sed删除命令中使用不同的分隔符,则需要以反斜杠开始地址,如下所示:

sed -i '\#.#d'
于 2012-12-13T17:26:39.030 回答
1

这与没有任何关系,如果你真的不能改变分隔符然后只是/用反斜杠转义所有实例,\如:

sed -i '/\//d'

sed -i '\#/#d'这样做的技巧,这将删除所有包含/.

您应该告诉我们您要做什么,因为我觉得这里根本不需要

于 2012-12-13T17:24:11.893 回答