2014-02-28 41 views
1

我有一個問題有關的sed:
在file.txt的假設的東西是這樣的:

one 


two 
three 

然後我運行:

sed '/^$/d;G' file.txt 

我認爲這個過程應該是這樣的:

for line in file { 
    pattern_space = line 
    if (pattern_space == "\n") then pattern_space = "" 
    pattern_space = pattern_space + "\n" + hold_space 
    print pattern_space 
} 

話,我想結果應該是這樣的:(空白行不動,非空白線後跟行)

one 



two 

three 

但是,現實的情況是:

one 

two 

three 

我彷彿運行的sed '/^$/d' file.txt的| sed G,我對此感到困惑。
你能告訴我什麼是正確的過程嗎?有什麼我誤解?
/BR

回答

3

這是因爲在d結束的腳本立即結束該行的處理,而不會(默認)打印。如果您想跳過腳本的其餘部分,但仍然執行腳本結束操作,請改爲使用b。默認b牧場目標是腳本結束。

+0

嗨,@jthill,我想問一點點,請。從手冊中說,「n N讀/將下一行輸入添加到模式空間中」,當我使用** n **時,爲什麼模式空間中的原始內容被打印出來?例如「sed'n; d'file.txt」,這個命令只是切斷了偶數行。我認爲應該沒有什麼輸出,因爲**閱讀下一行到**。 pattern_space中的原始東西應該消失,但它不是 – ruanhao

+0

我不知道你在哪裏得到該手冊,[真正的](http://www.gnu.org/software/sed/manual/sed。 html)說---'n' 如果自動打印未禁用,則打印模式空間,然後,無論如何,用下一行輸入替換模式空間。如果沒有更多輸入,則sed退出而不處理任何更多的命令 – jthill

+0

謝謝@jthill,你是對的 – ruanhao