Sed定界符与Grep并不好玩

时间:2012-12-13 17:18:46

标签: linux sed grep

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

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

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

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

是否存在这个问题?

5 个答案:

答案 0 :(得分:1)

如果您真的无法更改分隔符,那么不能很好地协调,而只是使用反斜杠{{1}转义/的所有实例喜欢:

\

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

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

答案 1 :(得分:1)

根据sed's man page,任何字符都可以用作匹配正则表达式的行,语法为\cregexpc,其中c是任意字符。

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

答案 2 :(得分:1)

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

sed -i '\#.#d'

答案 3 :(得分:1)

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

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

\xMATCHTHISxd

这将删除某处MATCHTHIS的行。

答案 4 :(得分: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移动到查找行,但它似乎有点无意义并且会混淆代码。