for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "s/var Handlebars/d" {}; done;
我似乎已经尝试了所有方法,包括转义 the;之后{}、转义两个;'s、转义引号、调整sed命令 - 一切都无济于事。是什么赋予了?
(不要使用。如果任何文件名包含空格,它将失败,这是不必要的。完全按照您的意愿进行操作,而无需子进程。)for i in lsfor i in *
正确的语法是:
for fn in *; do
find /path/ -name "$fn" -type f -exec sed ... {} \; ;
done
\;是要找的论据。两者{}和;必须作为单独的论点出现;如果您使用{}\;shell 会将它们组合成一个参数,find并将其视为sed.
第二个;是终止find命令的 shell 元字符。如上所写,在三行中,这;是不必要的,但如果你想要一个单行,它将是必需的。如果你将它转义为 as \;,它就不再是一个 shell 元字符,而是简单地find作为参数传递给它,在那里它会产生一个错误。
所写的 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
这个问题有两个方面。rici 是正确的,需要一个额外的分号,但在那之后它仍然失败,除非在{}和之间插入一个空格字符\;。最终命令如下所示:
for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "/var Handlebars/d" {} \;; done;
注意:我还根据 Cwissy 的评论s从命令中删除了(替换) 。sed