0

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

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

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

replace.sh 一些新的东西

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

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

文件按预期更改。

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

谢谢!

卢多。

4

3 回答 3

4

变量替换不在单引号中完成,请尝试:

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

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

于 2012-03-02T10:00:12.987 回答
1

在 sed 表达式中使用""而不是。''它不会阻止变量名解析。您现在实际上正在做的是替换$1$2. 您可以像这样在控制台中进行测试(无需编写脚本):

$ a=something

$ b=somethingelse

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

$ sed "s/$a/$b/g" testfile
于 2012-03-02T10:00:53.787 回答
0

这与您的问题无关,但对使用 ack 有一些帮助。

-a相互--text冲突。 -a会给你一个超集--text. 使用其中一种。

此外,看起来您最好使用grep -Zack 而不是 ack,因为您没有使用 ack 的任何作为 grep 超集的功能。

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

于 2012-06-05T17:15:12.227 回答