全球替代shell脚本不工作

问题描述:

我有这样一个shell脚本:全球替代shell脚本不工作

for fl in /home/dr/*.txt; do 
mv $fl $fl.old 
sed 's#$1#$2#g' $fl.old > $fl 
rm -f $fl.old 
done 

,我运行它像./script.sh find replace,但没有任何反应,也没有输出。为什么是这样?

+2

在单引号里''''$ 1'和'$ 2'可能不是你的意思。 – 2012-08-07 10:07:44

问题是您使用单引号而不是双引号。用单引号,sed字面解释字符串(即它将搜索字符串$1,而不是第一个参数)。

下面是你正在尝试做的功能版本。请注意,我已经用sed的“in-place”编辑替换了临时文件的使用情况。

for fl in /home/dr/*.txt 
do 
    sed -i "s#$1#$2#g" $fl 
done 

然而,可以单样样在行

sed -i "s#$1#$2#g" /home/dr/*.txt 
+0

感谢您的回答。如果$ 1包含'/'这会导致问题吗?这就是为什么我用#符号代替。并且是'。'故意从txt中省略? – dukevin 2012-08-07 09:39:11

+0

是的,它会导致一个问题,'#'是一个更好的选择,正是因为这个原因。对不起。我只是使用斜线作为习惯的力量。 – 2012-08-07 09:41:22

+0

不,由于我的sl iness,遗漏了'.'。很好,我再次道歉。 – 2012-08-07 09:43:18

这可能为你工作(GNU SED):

sed -i "s#$1#$2#g" /home/dr*.txt 

你有问题是单引号括起来的sed命令不允许插值。

+0

谢谢!这使它起作用 – dukevin 2012-08-07 10:13:20

+0

它看起来像你接受了错误的答案。 *被接受的答案已被打破。 – 2012-08-07 10:32:04

+1

@亨克:修好了! – 2012-08-07 10:43:19