在sed中使用美元符号表示变量替换和字符

时间:2017-10-20 04:43:28

标签: bash sed escaping

我尝试使用sed来更改名为convergence.gnu的文件中的一行 我有一个名为lafila的变量,它是一个文件名

目前,我可以这样做:

lafila="nGas060.dat"
sed -i "6s/.*/plot \"$lafila\" using 1:2 with l/" convergence.gnu

这会将convergence.gnu文件的第六行正确更改为:

plot "nGas062.dat" using 1:2 with l

但是,现在我想在替换行中包含一个美元符号来获取:

plot "nGas062.dat" using ($1/1000):2 with l

你能告诉我在sed命令中要改变什么吗?如果我逃脱一个美元符号它不能正常工作。双美元也行不通。

3 个答案:

答案 0 :(得分:1)

我认为你的问题实际上是由($1/1000)中的正斜杠引起的,它与用于分隔sed命令的各个组件的斜杠冲突。您也需要转义正斜杠,或者使用不同的字符来分隔sed字符串。下列任何一个都应该有效:

lafila="nGas060.dat"
sed -i "6s/.*/plot \"$lafila\" using (\$1\/1000):2 with l/" convergence.gnu

lafila="nGas060.dat"
sed -i "6s,.*,plot \"$lafila\" using (\$1/1000):2 with l," convergence.gnu

使用不同的分隔符可以让你的sed字符串看起来更整洁,避免使用leaning toothpick syndrome

echo foo | sed "s,foo,/there/are/a/lot/of/slashes/here,"

好多了
echo foo | sed "s/foo/\/there\/are\/a\/lot\/of\/slashes\/here/"

答案 1 :(得分:0)

使用单引号:

sed -i '6s/.*/plot "'$lafila'" using ($1\/1000):2 with l/' convergence.gnu

单引号保护双引号,$不在其中解释。但是,您需要转义/

另见:

答案 2 :(得分:0)

试一试:

lafila="nGas060.dat"
sed -i "6s@.*@plot \"$lafila\" using (\\\$1/1000):2 with l@" convergence.gnu

你只需要在美元符号之后逃避反斜杠。

\\ + \$ == \\\$