将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' {} \;
是否存在这个问题?
答案 0 :(得分:1)
如果您真的无法更改分隔符,那么sed与grep不能很好地协调,而只是使用反斜杠{{1}转义/
的所有实例喜欢:
\
但sed -i '/\//d'
这样做,这将删除包含sed -i '\#/#d'
的所有行。
你应该告诉我们你要做什么,因为我觉得这里根本不需要grep。
答案 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移动到查找行,但它似乎有点无意义并且会混淆代码。