2017-10-20 161 views
1

我尝试使用SED改变一个名为convergence.gnu 我有一个名为lafila变量,它是一个文件名在sed两个变量替换和字符

目前文件中的行使用美元符号,我可以这样做:

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 

不过,现在我想包括DOL lar登录被取代的行代替:

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

你能告诉我在我的sed命令中要改变什么吗?如果我逃离美元符号,它不能正常工作。双美元也不起作用。

+0

请问您可以添加示例输入和预期输出吗?所有人都能理解这个问题。 – RavinderSingh13

+0

使用反斜杠转义美元符号确实有效('$ echo“\ $ PATH” #打印$ PATH'),那么您能向我们展示您尝试的确切命令和结果吗? – Kevin

+0

好的,我编辑清楚,在sed我想先打印一个变量替换,然后我想打印美元符号。 – Nando

回答

0

使用单引号:

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

单引号保护双引号和$并不在他们里面解释。但是,您需要转义/

参见:

+0

但nGas062.dat是一个名为'$ lafila'的变量。 首先,我需要sed来替换$ lafila,然后使用$ 1/1000也就是说,如果变量'$ lafila = nGas062.dat' 那么我需要输出: 'plot“nGas062.dat”using( $ 1/1000):2与l' – Nando

+0

更新了答案。 – codeforester

+1

**完美。**这产生了预期的结果。谢谢!: 'sed -i'6s /.*/ plot''$ lafilas'“使用($ 1 \/1000):2 with l \'convergence.gnu' 导致: 'plot”nGas060.dat“使用($ 1/1000):2与l' – Nando

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/" 
+0

没有给出的命令可以读取'lafila'变量。第一个和第二个导致:“plot”“使用($ 1/1000):2 with l'带空格,其中'lafila'变量应该是 – Nando

+0

这只是因为我没有将lafila定义为I的部分没想到你在那个部分有问题。我只是在处理似乎给你一个问题的sed命令。我会编辑我的答案。 –

0

好得多的尝试:

lafila="nGas060.dat" 
sed -i "[email protected]*@plot \"$lafila\" using (\\\$1/1000):2 with [email protected]" convergence.gnu 

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

\\ + \$ == \\\$