2011-11-22 20 views
5

從sed的文檔中的 'D' 命令:在sed實用

d  Delete the pattern space; immediately start next cycle. 

是什麼由下一個週期是什麼意思?我的理解是,sed將不會應用以下命令,該命令在命令後面並開始從輸入流中讀取下一行並對其進行處理。但似乎這不是事實。看到這個exampel:

[[email protected] ~]# cat -A test.txt 
aaaaaaaaaaaaaa$ 
$ 
bbbbbbbbbbbbb$ 
$ 
$ 
ccccccccc$ 
ddd$ 
$ 
eeeeeee$ 
[[email protected] ~]# cat test.txt | sed '/^$/d;p;p' 
aaaaaaaaaaaaaa 
aaaaaaaaaaaaaa 
aaaaaaaaaaaaaa 
bbbbbbbbbbbbb 
bbbbbbbbbbbbb 
bbbbbbbbbbbbb 
ccccccccc 
ccccccccc 
ccccccccc 
ddd 
ddd 
ddd 
eeeeeee 
eeeeeee 
eeeeeee 
[[email protected] ~]# 

如果立即開始下一個週期,則p命令將不會有任何輸出。

任何人都可以幫我解釋一下嗎?謝謝。

回答

7

這意味着sed將讀取下一行並開始處理它。

您的測試腳本不會執行您的想法。它匹配空行並將刪除命令應用於它們。它們不出現,所以打印語句不適用於空行。兩個打印命令沒有連接到刪除命令的模式,所以非空行打印三次。如果您改爲嘗試

sed '/./d;p;p' test.txt # matches all non-empty lines 

除空白行之外不會打印任何內容,每行三次。

+0

我明白了。謝謝! –

+0

不客氣! –

1

一個)可以使用大括號爲一個圖案將多個命令:

sed '/^$/{d;p;p}' test.txt 

aaaaaaaaaaaaaa 
bbbbbbbbbbbbb 
ccccccccc 
ddd 
eeeeeee 

該命令d僅適用於這裏空行: '/^$/d; P; P'。否則,該行會再打印2次。要將'p'命令綁定到該模式,您必須創建大括號。然後,p命令也跳過了,但由於跳到下一個週期,並不是因爲它不匹配。

b)無用的貓。 (已經顯示)

+0

這樣做,刪除了評論。 –