2013-04-20 201 views
5

我可以使用sed來檢查某些命令輸出的第一行(輸出到標準輸出),並刪除第一行,如果它匹配某種模式?如何在條件匹配時僅使用sed刪除第一行?

說,該命令的輸出是這樣的:

"AB" 
"CD" 
"E" 
"F" 

我希望它變成:

"CD" 
"E" 
"F" 

但是,當第一行是"GH",我不想刪除線。

我嘗試這樣做,但它不工作:

<some_command> |sed '1/<pattern>/d' 

殼告訴我:

sed: 0602-403 1/<pattern>/d is not a recognized function. 

我只是想用sed來處理第一線,留下其他線路不變。

這裏的正確語法是什麼?

回答

6

這可能會爲你工作:

sed -e '1!b' -e '/GH/!d' file 
+0

它的工作原理!我想這裏'1'是指行號,但'!b'是什麼意思?另外,這兩個表達式可以合併爲一個(僅使用一個「-e」)? – 2013-04-21 01:34:22

+1

@強旭,是'1'是第一行,'!'表示'如果不是','b'是'break'命令,這意味着'如果不行1救市並繼續下一行'。對於第一行,只有'/ GH /!d'的意思是'如果該行不包含GH刪除''。一些sed允許使用';'字符作爲連接命令的方式,使用'BSD'或'Apple'你的成功可能會有所不同。 – potong 2013-04-21 06:48:52

+0

在'man sed'中,它只告訴我'b [label]分支到:帶有標籤變量的命令。如果標籤變量爲空,則分支到腳本的末尾。「手冊沒有提及」b「作爲中斷命令。然而,它是這樣工作的。我錯過了什麼? – 2013-04-21 22:46:47

2

這是你想要什麼:

$ sed '1{/"GH"/!d}' file 
+0

它不起作用,但:#sed:0602-404功能1 {/ /d}不能被解析。「我使用了」GH「作爲例子,並且想要關注我需要匹配的模式。這就是爲什麼我使用'd',而不是'!d'。 – 2013-04-21 00:15:31

+0

然後你有一個backlevel sed。嘗試在'{'之後和'}'之前放置換行符。 – jthill 2013-04-21 00:21:10

+0

@jthill:仍然不工作:'sed:0602-404函數1 {\ n//d \ n}無法解析.'我的'sed'來自AIX機器,不是GNU機器,:( – 2013-04-21 00:24:30

4

要引用一號線,然後說刪除:

$ sed '1 d' file 

無需要刪除這行中的任何模式,如果你知道。

對於模板,使用此語法:

$ sed '0,/pattern/ d' file 
+1

不,我想刪除第一行,只有當它有一個特定的模式時 – 2013-04-21 00:29:09

+0

沒有錯誤吐出,但它仍然不起作用。第一行不會被刪除。 – 2013-04-21 01:04:19

+0

當你看到第一行時'sed/pattern/file'? – 2013-04-21 01:06:03

2
sed '1{/<pattern>/{/GH/!d}}' input 

在你的表達錯誤可以固定這樣的:

sed '1{/<pattern>/d}' input 
+0

感謝您的幫助,但它不起作用。 – 2013-04-21 01:24:14