2014-07-17 114 views
1

類似的常見問題,但無法找到解決方案。用bash/sed/awk替換文件中的變量值

我有一個源文件(蟒):

MYVARIABLE = 123 
OTHERVAR = 23 
print str(MYVARIABLE) 

我想通過從遠程終端改變MYVARIABLE的到456的值來修改該文件,而無需經常性的文本編輯,只需一個命令oneliner 。

我想SED可以通過尋找在那裏MYVARIABLE發生,刪除一切與MYVARIABLE = 456

不知道如何可以這樣做替換,雖然第一線做的工作。 輸入?

回答

1

假設你sed版本支持的字符類,你可能會寫:

sh$ sed -r 's/([[:blank:]]*MYVARIABLE[[:blank:]]*=[[:blank:]]*)[[:digit:]]+/\1456/' file.py 
MYVARIABLE = 456 
OTHERVAR = 23 
print str(MYVARIABLE) 

或者

sh$ sed -r 's/(\s*MYVARIABLE\s*=\s*)[0-9]+/\1456/' file.py 
MYVARIABLE = 456 
OTHERVAR = 23 
print str(MYVARIABLE) 

雙方將變量定義之前保留空間。這很重要,因爲縮進在Python中很重要。

但請注意,這是相當脆弱的。這個簡單的正則表達式可能無法正確修改一些有效的python變量聲明。


如果你有足夠的信心「到位」,以替換,添加上的sed一些實現可用的-i選項。

man sed

-i[SUFFIX], --in-place[=SUFFIX] 

      edit files in place (makes backup if extension supplied) 
1

通過戰略經濟對話

$ sed '/^MYVARIABLE/s/^\(.*=\s*\).*$/\1456/' file 
MYVARIABLE = 456 
OTHERVAR = 23 
print str(MYVARIABLE) 
1

使用awk

awk '{if (/MYVARIABLE = [0-9]*/){print "MYVARIABLE = 456"}else{print $0}}' file 
MYVARIABLE = 456 
OTHERVAR = 23 
print str(MYVARIABLE) 
2

另一個sed

sed -r 's|^(MYVARIABLE\s*=\s*).*|\1456|' file 
+0

您確定這將行嗎?我雖然sed只帶了「基本」PCRE,這意味着'\ s'字符類無效,括號需要反斜槓轉義。 – djhaskin987

+0

@ djhaskin987當然它可以工作:'-r,--regexp-extended在腳本中使用擴展的正則表達式。 – konsolebox

+0

酷! +1我不知道。 – djhaskin987

0

這個簡單awk應該做的:

awk '/^MYVARIABLE/ {$3="456"}1' file 
MYVARIABLE = 456 
OTHERVAR = 23 
print str(MYVARIABLE) 

如果符合MYVARIABLE開始,第3場更改爲456
1打印所有行。

0
$ awk -v var="MYVARIABLE" -v val="456" '$1==var{$NF=val} 1' file 
MYVARIABLE = 456 
OTHERVAR = 23 
print str(MYVARIABLE) 

$ awk -v var="OTHERVAR" -v val="123456" '$1==var{$NF=val} 1' file 
MYVARIABLE = 123 
OTHERVAR = 123456 
print str(MYVARIABLE) 
0

使用sed,我們可以拆分聲明爲兩個 - 並使用所需的變量[這裏,456]替代的第二部分。

sed -i "s#\(.*MYVARIABLE =\)\(.*\)#\1 "456"#" file

0

將該溶液通過限制給定部分是通常用於INI文件的變化。

sed -ri '/'$SECTION'/,/\[/ s/(\s*'$KEY'\s*=\s*).+/\1'$VALUE'/' "$INI_FILE"