2017-10-20 163 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 

你只需要逃避反斜槓和美元符號後。

\\ + \$ == \\\$