我有一个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或其他事情的事情?
谢谢!
鲁
答案 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'。