for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "s/var Handlebars/d" {}; done;
我尝试过似乎所有事情,包括在;
之后转义{}
,转义两个;
,转义引号,调整sed
命令 - 全部转到徒劳无功。是什么给了什么?
答案 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
(替换)。