发现:缺少“-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
(替换)。
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
(替换)。