2014-01-10 95 views
0

我想使用sed來進行替換,而不是通過搜索要替換的內容。sed部分替換或變量

請允許我解釋一下。我有一個變量初始設置爲默認值。

VARIABLE="DEFAULT" 

我可以做一個sed有我想要的東西來替代默認,但我將不得不把DEFAULT回來時,我全部完成。這是因爲存儲到VARIABLE的內容對用戶來說是唯一的。我想用sed來搜索除了要替換的東西以外的其他東西。例如,搜索VARIABLE =「和」並替換它之間的什麼。這樣它只是不斷更新,並且不需要重置VARIABLE。

這是我要做的事目前:

我調用腳本並傳遞參數

./script 123456789 

劇本里面,這是發生了什麼:

sed -i "s%DEFAULT%$1%" file_to_modify 

這將替換

VARIABLE="DEFAULT" 

VARIABLE="123456789" 

這將是很好,如果我沒有搜索「默認」,因爲那樣的話我就不會在腳本結束時重置的變量。

回答

1
sed -r 's/VARIABLE="[^"]*"/VARIABLE="123456789"/' file_to_modify 

,或者更一般地說:

sed -r 's/VARIABLE="[^"]*"/VARIABLE="'"$1"'"/' file_to_modify 

上述兩種使用正則表達式查找「​​變量=‘什麼不惜一切’主義取代它,在第一個例子中的在'VARIABLE =「123456789」'之上,或者在第二個'VARIABLE =「$ 1」'',其中「$ 1」是腳本的第一個參數。關鍵要素是[^"]。它意味着除雙引號以外的任何字符。 [^"]*表示除雙引號之外的任意數量的字符。因此,我們會將之前的雙引號"[^"]*"替換爲我們的新值"123456789",或者在第二種情況下替換"$1"

第二種情況有點棘手。我們想用$1代替表達式,但表達式本身就是單引號。在單引號內,bash不會替代$1。因此,sed命令被分成三個部分:

# spaces added for exposition but don't try to use it this way 
's/VARIABLE="[^"]*"/VARIABLE="' "$1" '"/' 

第一部分是用單引號和bash通過它字面上的sed。第二部分用雙引號,所以bash將替代`$``的值。第三部分是單引號,並從字面上傳遞給sed。

MORE:下面是一個簡單的方法來測試在命令行上這種方法不依賴於任何文件:

$ new=1234 ; echo 'VARIABLE="DEFAULT"' | sed -r 's/VARIABLE="[^"]*"/VARIABLE="'"$new"'"/' 
VARIABLE="1234" 

上面的第一行是在提示($)運行的命令。第二個是運行命令的輸出。

+0

請您補充一點解釋嗎? – Atomiklan

+0

我試過sed -r'/ VARIABLE =「([^」] *)「/ VARIABLE =」$ 1「/'file_to_modify,腳本凍結 – Atomiklan

+0

你需要括號括起來嗎?我想你也可以用' 's/VARIABLE =「[^」] *「/ VARIABLE =」123456789「/'' –