【发布时间】:2016-02-20 00:45:53
【问题描述】:
我在/etc/bashrc中写了一个函数,因为我经常使用它,但现在它似乎不起作用:
function replaceall() {
find "$1" -type f -exec sed -i "s|$2|$3|g" {} \;
}
当直接运行它时,我会做类似的事情:
find ./*/conf/production/*.conf -type f -exec sed -i "s|/home/user/sites|/var/www/vhosts|g" {} \;
效果很好。但是当使用replaceall 函数调用时它不起作用:
replaceall ./*/conf/production/*.conf "/home/user/sites" "/var/www/vhosts"
注意:当我使用 replaceall . [...] 时它确实有效,这让我想知道,我是否遗漏了一些关键语法?
【问题讨论】:
-
您在
"$1"周围缺少一些双引号,首先。 -
谢谢@TomFenech,我已经完成了并更新了我的问题。
-
注意
./*/conf/production/*.conf会被扩展,所以$2可能包含这些扩展之一。通过说echo find ...进行调试,看看到底有什么。 -
啊哈! @fedorqui 是的,它只回显了一行,
$1、$2和$3分别是找到的前三个文件。我用引号调用它(replaceall "./*/..." ...但这只是说找不到文件。有没有办法实现两者? -
你确定你肯定需要使用
find吗?如果是这样,您可能应该使用-name '*.conf',结合-prune跳过不包含conf/production的路径(尽管我不确定我脑海中的确切语法......)