0
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命令 - 一切都无济于事。是什么赋予了?

4

3 回答 3

3

(不要使用。如果任何文件名包含空格,它将失败,这是不必要的。完全按照您的意愿进行操作,而无需子进程。)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作为参数传递给它,在那里它会产生一个错误。

于 2016-05-31T16:46:20.000 回答
2

所写的 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

于 2016-05-31T17:29:05.813 回答
0

这个问题有两个方面。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

于 2016-05-31T17:52:39.163 回答