2013-12-13 103 views
22

我一直在網上尋找這個答案,似乎無法找到它。如何使用sed替換配置文件的變量?

我有一個包含一個配置文件:

VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE5 
VAR6=VALUE6 

而且我想改變VAR5的值從值5至VALUE10。不幸的是,我不知道VALUE5的價值,所以我無法搜索它。所以基本上我需要使用sed(或其他)將VAR5的值替換爲我想要替換的值。

編輯:感謝確認的解決方案,我能夠在BASH中使用以下內容來編輯我的配置文件,方法是將參數傳遞給bash腳本。由於我傳遞給腳本的參數將包含斜線,所以斜線被逗號替換。

sed -i 's,^\(THISISMYVARIABLE=\).*,\1'THISISMYVALUE',' config.cfg 

我的文件包含:

THISISMYVARIABLE=SOMEOLDVALUE 

在bash運行sed命令後

THISISMYVARIABLE=THISISMYVALUE 
+0

「VALUE10」從哪裏來?它是否來自同一個文件中的另一行?或者它只是一些任意值? – Sildoreth

+0

VAR5在我的配置文件是USER_INSTALL_DIR和VALUE10是什麼,它可能是垃圾。我想讓VAR5或在我的情況下USER_INSTALL_DIR設置爲我通過bash腳本傳遞給它的變量。感謝anubhava的評論,以下內容適用於我。我也用逗號替換了斜線,因爲我的bash腳本所傳遞的參數將包含斜線,因爲它傳遞的是用戶目錄。 – SomeGuyOnAComputer

回答

32

你可以試試這個sed的:

sed -i.bak 's/^\(VAR5=\).*/\1VALUE10/' file 

它提供:

VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE10 
VAR6=VALUE6 
+3

+1。我只是想提供另一個簡單的(但不太有效的,只有當我們確切知道開始時才起作用):'sed -i.bak's/^ VAR5 =。*/VAR5 = VALUE10 /'file' –

+0

問題這兩個答案都是它需要你知道VAR5的價值。在我的情況下,你不知道VAR5的值,所以你想找到「VAR5 =」並找到該行和新行之間的字符串。 – SomeGuyOnAComputer

+1

您的示例中'VAR5'的值爲'VALUE5',並且此答案不需要知道'VALUE5' – anubhava

3

你可以說:

sed '/^VAR5=/s/=.*/=VALUE10/' filename 

要在更改文件就地,使用-i選項:

sed -i '/^VAR5=/s/=.*/=VALUE10/' filename 
0

請嘗試以下

sed -r's/^(VAR5 =)。*/\ 1REPLACEMENT /'

VAR5的值將替換爲REPLACEMENT。

1
sed '/\(^VAR5=\).*/ s//\1VALUE10/' YourFile 

在AIX/KSH

$ cat sample.txt 
VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE5 
VAR6=VALUE6 

$ sed '/\(^VAR5=\).*/ s//\1VALUE10/' sample.txt 
VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE10 
VAR6=VALUE6 

和用於替換在文件

cat <> YourFile | sed '/\(^VAR5=\).*/ s//\1VALUE10/' 

$ cat <> sample.txt | sed '/\(^VAR5=\).*/ s//\1VALUE10/' 
$ cat sample.txt 
VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE10 
VAR6=VALUE6 

要POSIX(上sed一部分,而不是cat)兼容(SED上GNU --posix sed和原生在非linux系統上的傳統sed)

+1

沒有任何關於[無用的'cat'] ://partmaps.org/era/unix/award.html)。此外,鑽石'<>'看起來完全錯位。 – tripleee

4

即使t如果答案已經添加到問題中。我花了它是如何工作了一段時間,我想補充一些事實,我的答案的版本,

sed -i 's,^\(THISISMYVARIABLE[ ]*=\).*,\1'THISISMYVALUE',g' config.cfg 

說明:

  • 作爲sed 's/find_this/replace_with/'一個基本的,我們說sed來搜索和替換。還請記住,我們可以使用其他多個分隔符,而不是/。這裏使用,
  • 這裏我們找到與^\(THISISMYVARIABLE[ ]*=\).*匹配的行。這意味着我們將比賽分組THISISMYVARIABLE[ ]*=。 ([ ]*覆蓋是否有空格後的密鑰)
  • 替換部分\1是回參考。我們參照我們用於匹配的正則表達式中的第一個組。
+0

根據操作,THISISMYVALUE不帶引號。爲什麼在平等之前的空間似乎過度矯正!剩下的是有效的,反向引用是正確的名稱.. – Timo