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
ls
for 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