我尝试使用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命令中要改变什么吗?如果我逃脱一个美元符号它不能正常工作。双美元也行不通。
答案 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
你只需要在美元符号之后逃避反斜杠。
\\ + \$ == \\\$