【发布时间】:2016-09-29 18:41:38
【问题描述】:
for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "s/var Handlebars/d" {}; done;
我似乎尝试了所有方法,包括在{} 之后转义;,同时转义;,转义引号,调整sed 命令 - 一切都无济于事。什么给了?
【问题讨论】:
for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "s/var Handlebars/d" {}; done;
我似乎尝试了所有方法,包括在{} 之后转义;,同时转义;,转义引号,调整sed 命令 - 一切都无济于事。什么给了?
【问题讨论】:
问题有两个方面。 rici 是正确的,需要一个额外的分号,但之后它仍然失败,除非在 {} 和 \; 之间插入空格字符。最终命令如下所示:
for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "/var Handlebars/d" {} \;; done;
注意:根据 Cwissy 的评论,我还从 sed 命令中删除了 s(替换)。
【讨论】:
{} 后面的空格写的很清楚。实际上,您的答案中没有任何地方提到空间。我的命令中唯一没有让它不抛出错误的是额外的分号(你确实提到过)和空格。所有其他信息都是不必要的,并且进一步混淆了答案。
所写的 sed 命令将失败,因为 sed 期望 s 命令有 2 个参数。 您是否试图删除所有存在“var Handlebars”的行,如果是,那么正确的方法(使用 sed)将是
sed '/^.*var Handlebars.*$/d'
这就是说“删除(用于 sed 的 'd' 命令)任何包含字符串 'var Handlebars' 的行”
锚 ^ 和 $ 分别是行首和行尾,'.*' 表示 'var Handlebars' 字符串之前和之后的任何字符的零个或多个。
所以你的复合命令现在变成了:
for i in *; do
find /path/ -name "$i" -type f -exec sed -i '/^.*var Handlebars.*$/d' {} \;
done
【讨论】:
sed -i "/var Handlebars/d" 似乎可以很好地删除包含该字符串的任何行。
(不要使用for i in 。如果任何文件名包含空格,它将失败,并且没有必要。lsfor i in * 完全符合您的要求,无需子进程。)
正确的语法是:
for fn in *; do
find /path/ -name "$fn" -type f -exec sed ... {} \; ;
done
\; 是要查找的参数。 {} 和 ; 都必须作为单独的参数出现;如果你使用{}\;,shell 会将它们组合成一个参数,find 会将其视为sed 的一个简单参数。
第二个; 是一个shell 元字符,它终止find 命令。如上所写,在三行中,; 是不必要的,但如果您想要单行,则需要它。如果你将它转义为\;,它就不再是一个shell 元字符,而是简单地作为参数传递给find,在那里它会产生一个错误。
【讨论】:
for i in `ls`; do find /path/ -name $i -type f -exec sed -i "s/var Handlebars/d" {}\; ; done; 这对我来说也失败了。
for i in `ls` 对我来说工作得很好(我的文件名都不包含空格)。