发现:缺少“-exec”的参数,即使在转义分号之后

find: missing argument to `-exec', even after escaping semicolon

for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "s/var Handlebars/d" {}; done;

我似乎尝试了所有方法,包括在 {} 之后转义 ;,转义两个 ;,转义引号,调整 sed 命令 -一切都无济于事。给出了什么?

(不要在 ls 中使用 for i。如果任何文件名包含空格,它将失败,这是不必要的。<code>for i in * 确实如此你想要什么,不需要子流程。)

正确的语法是:

for fn in *; do
  find /path/ -name "$fn" -type f -exec sed ... {} \; ;
done  

\; 是要查找的参数。 {}; 都必须作为单独的参数出现;如果您使用 {}\;,shell 会将它们组合成一个参数,而 find 会将其视为 sed.

的一个简单参数

第二个 ; 是一个 shell 元字符,它终止 find 命令。如上写,在三行中,; 是不必要的,但如果你想要一行,它将是必需的。如果你将它转义为 \;,它不再是 shell 元字符,而只是作为参数传递给 find,它将产生错误。

所写的 sed 命令将失败,因为 sed 期望 s 命令有 2 个参数。 您是否试图删除所有存在 "var Handlebars" 的行,如果是这样,那么正确的方法(使用 sed)将是

sed '/^.*var Handlebars.*$/d'

也就是说 "delete (the 'd' command to sed) any line that contains the string 'var Handlebars'"

锚点 ^ 和 $ 分别是行首和行尾,'.*' 表示 'var Handlebars' 字符串前后任何字符的零个或多个。

所以你的复合命令现在变成:

for i in *; do find /path/ -name "$i" -type f -exec sed -i '/^.*var Handlebars.*$/d' {} \; done

这个问题有两个方面。 rici 是正确的,需要有一个额外的分号,但在那之后它仍然失败,除非在 {}\; 之间插入一个 space 字符。最终命令如下所示:

for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "/var Handlebars/d" {} \;; done;

注意:根据 Cwissy 的评论,我还从 sed 命令中删除了 s(替换)。