如果我手动输入但不在脚本中,则替换脚本有效

时间:2012-03-02 09:54:16

标签: bash shell ack

我有一个bash脚本,replace.sh包含以下内容:

ack-grep -a -l -i --print0 --text "$1" | xargs -0 -n 1 sed -i -e 's/$1/$2/g'

当我尝试运行它时,例如:

替换新的东西

提示返回没有错误,但没有对任何文件进行任何更改。 如果我手动输入:

ack-grep -a -l -i --print0 --text "something" | xargs -0 -n 1 sed -i -e 's/something/somethingelse/g'

文件按预期更改。

$ 1语法似乎适用于我编写的其他脚本。我猜我错过了逃避args或其他事情的事情?

谢谢!

3 个答案:

答案 0 :(得分:4)

变量替换不是用单引号完成的,请尝试:

ack-grep -a -l -i --print0 --text "$1" | xargs -0 -n 1 sed -i -e "s/$1/$2/g"

请参阅有关QUOTING的bash手册页部分。

答案 1 :(得分:1)

在sed表达式中使用""代替''。它不会阻止变量名解析。您现在实际在做的是将$1替换为$2。您可以在控制台中测试(无需编写脚本),如下所示:

$ a=something

$ b=somethingelse

$ sed 's/$a/$b/g' testfile

$ sed "s/$a/$b/g" testfile

答案 2 :(得分:0)

这与您的问题无关,但在使用确认时有一些帮助。

-a--text相互冲突。 -a将为您提供--text的超集。使用其中一种。

此外,您似乎也可以使用grep -Z而不是ack,因为您没有使用任何作为grep超集的ack功能。

一般来说,如果你在管道中使用ack,你可能应该使用好的'grep'。