2016-02-09 56 views
2

之間的文本,所以我發現這個SED表達爲獲得獨家的關鍵字的關鍵字之間的文本:使用SED獲得兩個關鍵詞(而不是關鍵詞本身)

cat example.txt | sed '/^KEYWORD1/,/^KEYWORD2/!d; //d' 

其中一例。 TXT:

do 
not 
care 
KEYWORD1 
I 
want 
this 
KEYWORD2 
do 
not 
care 

輸出:

I 
want 
this 

不過,我想了解知道是什麼正在用這個表達。我的理解是,使用'模式範圍'(如果這是不恰當的術語,請糾正我),當您第一次匹配時設置布爾值,並且僅在布爾值爲true時才執行模式範圍後面的命令。

然後是//d其中//應該表示最後匹配的表達式/正則表達式。因此,它是正確的,在這種情況下,帶有圖案的範圍,邏輯如下:!

  • 查找/^KEYWORD1/,設置布爾爲true,用d命令進行不刪除這條線,然後自從上次的正則表達式是/^KEYWORD1/然後//d實際上是/^KEYWORD1/d它刪除此行,則進入不刪3個下一行和/^KEYWORD1/沒有在所述行因此沒有被刪除
  • 查找/^KEYWORD2/d發現
  • 布爾爲真,則執行!d和然後/^KEYWORD2/d,因爲這是最後的正則表達式中使用

所以在這一點上,我不知道如何前後線不打印,因爲它不執行,除非模式範圍標誌命令(!d)設置爲true。

或者確實至少看看每一行的命令,並且由於第一個命令是反向刪除,它會以某種方式更改邏輯以刪除模式範圍bool爲false的所有其他行?

任何澄清如何這個sed表達式的作品將不勝感激。我已經讀了this great resource上下,但仍不完全理解表達的所有細節。

+1

如果將光標懸停在上面的sed標誌上並選擇info,您可以找到sed相關問題的巨大資源。也許[this](http://sed.sourceforge.net/sedfaq3.html#s3.3)鏈接也可能啓發你。 – potong

回答

1

您的誤解是這樣的:/address/!d並不意味着「如果我們匹配address,請勿刪除該行」;該!否定地址,即「如果我們比賽address,然後確實刪除了就行了。」

所以一襯裏(更好寫入而不cat,順便)

sed '/^KEYWORD1/,/^KEYWORD2/!d; //d' example.txt 

執行此:

  • /^KEYWORD1/,/^KEYWORD2/!d:對於範圍/^KEYWORD1/,/^KEYWORD2/,即外的所有行,

    do 
    not 
    care 
    do 
    not 
    care 
    

    刪除它們。 d跳回到腳本的開始處。這給我們留下了

    KEYWORD1 
    I 
    want 
    this 
    KEYWORD2 
    

    ,我們不希望打印KEYWORD1KEYWORD2

  • 對於這些行,我們會遇到//d,這意味着「刪除最後一個匹配行」。

    KEYWORD1一行中,我們檢查並刪除了該行,因爲它之前是匹配的。在接下來的三行中,我們經歷了,但沒有匹配,所以我們不刪除任何東西。在KEYWORD2這一行中,我們通過並刪除,因爲它在–之前匹配了兩個模式之間的界限。

+0

謝謝!我用cat寫了它,因爲我實際上是將另一個命令的輸出從一個文件傳輸到sed和vs,但是指出了一點。 – jshort

+0

當你說'd跳回到腳本的開始'時,你是否意味着它會返回到模式範圍的否定被刪除後剩下的內容的開始,以便第二個命令(// d)可以通過剩下的幾行? – jshort

+0

@jshort我的意思是這樣的:sed處理每行的整個腳本,只有幾條命令改變了標準流。 'd'爲1:當前模式空間被丟棄並且不被打印,下一行被加載到模式空間並且我們跳回到第一條指令。所以「跳回」真的是爲了當前的週期,而不是跳到另一條線。 –