2013-02-07 70 views
2

的子我有以下內容的文本文件(「file.txt的」):sed的(或AWK)的正則表達式來替代匹配

# disutil_screening = 0.00000; # favorable 
    disutil_screening = 0.00009; # base 
# disutil_screening = 0.00019; # unfavorable 

我需要切換這些3行(或者「有利」,「基礎」或「不利」)使用GNU Sed進行註釋。

我知道我可以匹配代碼的「有利」行如下面(其中,作爲僞例如,我簡單地用「AAA」替換文本):

$ cat file.txt | sed -r 's/#[\t]disutil_screening[\ =0-9\.;]+# favorable/aaa/' 
aaa 
    disutil_screening = 0.00009; # base 
# disutil_screening = 0.00019; # unfavorable 

然而,這個例子Sed聲明顯然與我實際想要的很遠。我需要一個Sed表達式,它只會刪除前導的「#」。也就是說,我需要一個sed表達式($EXPR),使得如上圖所示下列方式被修改文件「file.txt」的內容:

$ cat file.txt | sed -r $EXPR 
    disutil_screening = 0.00000; # favorable 
    disutil_screening = 0.00009; # base 
# disutil_screening = 0.00019; # unfavorable 

一旦我知道如何做到這一點(更換龍頭「 #「與」「爲」有利「線),那麼我相信我可以弄清楚如何將」#「添加到」基本「行(即註釋掉當前未被註釋掉的行)。

注意:我可以使用awk來完成這個任務而不是sed,但是我有點被awk嚇倒了,從來沒有用過它。

+0

供參考:其實,有許多不同的'disutil_ *'在文本文件中的語句。但爲了這個問題的目的,我只是假設唯一一個是'disutil_screening'。實際上有'disutil_biopsy','disutil_surgery'等。因爲有很多disutil的,我需要使這個自動切換註釋行。 – synaptik

回答

6

我認爲你所需要的就是所謂的分組。試試這個:

$ cat file.txt | sed -r 's/#([\t]disutil_screening[\ =0-9\.;]+# favorable)/\1/' 

我包的所有比賽預計第一註解字符成團,然後用這組替換整場比賽所以第一個字符將被刪除。

+0

啊,所以對於評論一個目前未註釋的行的情況下,我可以做這樣的事情,對吧? ''s/^([\ t] disutil_screening [\ = 0-9 \ .;] +#favourite)/#\ 1 /' – synaptik

+0

謝謝,這正是我所需要的! – synaptik

+0

如何當我使用你的sed表達式,但添加'-i'選項時,我得到錯誤:''command''RHS'上的'invalid reference \ 1'? – synaptik

4

這是我想出來的。請注意,-i使內嵌替換(即您的原始文件將被更改)。

$ sed -i 's/^#\(.*# favorable\)$/ \1/' text.txt 
+0

謝謝。我很高興看到你的答案是補充AlexAtNet的,當不使用'-r'選項時,通過演示捕獲組的語法。我從看到兩種方式瞭解更多:) – synaptik

3

用awk

awk -F= '$2 ~/favorable/{sub("#","")}1' temp.txt 

輸出

disutil_screening = 0.00000; # favorable 
    disutil_screening = 0.00009; # base 
# disutil_screening = 0.00019; # unfavorable 
+0

謝謝。其中一天,我應該學習awk。 – synaptik