2016-02-04 29 views
0

基本上我只需要取消註釋包含特定字符串的兩行。 因此,我grep字符串來獲取行號,並使用sed取消註釋 (當然也可以使用sed來獲取行號,但問題是相同的)。Bash:使用linenumbers在sed中使用它們

你得到的行號都在它自己的行上,我不知道如何處理坐在它自己的行上的行號,所以即時通訊嘗試將它們放入一行以使用bash變量來處理行號:

$ cat configfile 
some text 
    #a string foo 
    #b string bar 
some other text 
#more text 
much more text 

所以我的第一次嘗試是:

linenr=$(grep -n string configfile | cut -d: -f1)  # get line numbers (several lines) 
linenr=(${linenr//\/})        # put line numbers into one line 
sed -i "${linenr[0]},${linenr[1]} s/##*//" configfile # uncomment lines 

我的第二次嘗試是:

linenr=$(sed -n '/string/=' configfile)    # get line numbers (several lines) 
linenr=$(echo $linenr | sed -i 's/\n/ /' configfile) # put line numbers into one line 
sed -i "${linenr[0]},${linenr[1]} s/##*//" configfile # uncomment lines 

我需要這樣做兩次,對於兩個幾乎類似的配置文件,出於某種原因,我得到了不同的行數輸出,儘管代碼對於兩個configfiles都是一樣的:(適用於configfile4但不適用於configfile6?我認爲這些文件的內容與找到的行號的輸出無關?還檢查線路的結局,是同在這兩個文件)

configfile4lines: 
44 45 
configfile6lines: 
54 
55 

在這樣一個situtions工作,行號或應該如何有更好的方法來做到這一點?

回答

2

您可以使用正則表達式匹配作爲sed中的地址,而不是行號。

sed -i '/string/s/##*//' configfile 
+0

按預期工作!太好了謝謝! – vchrizz

+0

沒問題,因爲這個效果更好,我也想把它用於其他字符串,但是對於那些字符串,有一些我不想取消註釋的配置示例。有沒有一種方法可以在取消註釋之前從找到的行中排除帶有字符串'example'的行?或者我應該以另一種方式在configfiles中定義這些示例? – vchrizz

+1

如果你比這更復雜,'sed'可能不是正確的工具。使用'awk'或'perl'。 – Barmar