找到:缺少`-exec'的参数,即使在转义分号后也是如此

时间:2016-05-31 16:24:19

标签: bash sed exec find-util

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

我尝试过似乎所有事情,包括在;之后转义{},转义两个;,转义引号,调整sed命令 - 全部转到徒劳无功。是什么给了什么?

3 个答案:

答案 0 :(得分:3)

(不要使用for i in ls。如果任何文件名包含空格,它将会失败,并且它是不必要的。ls完全符合您的要求,而不需要子进程。)< / p>

正确的语法是:

for i in *

for fn in *; do find /path/ -name "$fn" -type f -exec sed ... {} \; ; done 是一个可以找到的论据。 \;{}都必须作为单独的参数出现;如果您使用;,shell会将这些组合成一个参数,而{}\;会将其视为find的简单参数。

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

答案 1 :(得分:2)

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

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

这是说“删除('d'命令来sed)包含字符串'var Handlebars'的任何行”

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

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

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

答案 2 :(得分: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(替换)。