2016-07-27 35 views
1

我想用變量將sed命令替換爲精確的單詞。我的文件是這樣的:帶有精確變量變化的sed命令

//module xyz 
module xyz 

假設我有以下shell變量定義:

var1='module xyz' 
var2='module abc' 

我要那麼後更改XYZ在註釋掉線ABC只(模塊XYZ)

執行命令輸出應該是

//module xyz  
module abc 

我不想改變註釋行(// modu樂XYZ)

目前我使用SED命令,

sed -i "s|$var1|$var2|g" file_name 

但這命令不起作用。它也取代註釋行。我怎樣才能取代沒有評論的線?

+0

'var1 = module xyz' assings'module' to'var1' and runs'xyz'。 – choroba

+0

@choroba我的錯,我編輯了那部分,會修復。 –

回答

0

假設你知道模式是在該行的開始,你可以使用這個:

sed "s|^$var1|$var2|" file_name 

也就是說,添加錨點^,使比賽必須是在的開始線。

我刪除了-i開關,以便您可以對其進行測試,也可以使用g修飾符,因爲您只需要每行進行一次替換,所以這不是必需的。

值得一提的是,在sed中使用shell變量實際上是quite tricky to do in a reliable way,所以你應該考慮到這一點。

0
  • 如果有空間,應引用您的shell變量賦值。像:

    var1="foo bar blah" 
    
  • 您可以添加模式,「行不//啓動」你的sed命令,這樣只對那些線

這條線應該做你替換爲你的工作,例如:

sed -i "\@^//@\!s/$var1/$var2/g" file 
  • !需要進行轉義,因爲我們使用雙引號
  • 因爲你的模式(評論)有斜線(/),我用其他字符作爲正則表達式分隔符
  • 這條命令只會對不以//開頭的行進行替換。如果有前導空格,則可能需要調整模式^//
0

您需要識別模式,以便不應處理包含該模式的行。 假設//將只存在於註釋行可以使用

sed -i '/\/\// !s/$var1/$var2/g' file_name

/\/\//將使sed來識別哪個包含模式//線,並且!s將使您跳過這些行。