2014-06-06 83 views
0

如何使用sed刪除包含特定模式的第一行?刪除與模式匹配的第一行

例如,我想刪除的第一行從這個文檔匹配FAA

1. foo bar quuz 
2. foo FAA bar (this should go) 
3. quuz quuz FAA (this should remain) 
4. quuz FAA bar (this should also remain) 

結果應該是

1. foo bar quuz 
3. quuz quuz FAA (this should remain) 
4. quuz FAA bar (this should also remain) 

一種用於POSIX溶液SED將不勝感激,GNU SED沒問題。

回答

4

隨着GNU sed的,你可以用下面的習慣:

sed '0,/FAA/{/FAA/d}' input.txt 

它適用於它,它的行動的範圍從文件開始到FAA第一次出現。然後它刪除這條線。

+0

+1漂亮,短,特別是'0'地址,以及考慮! – Kent

+1

0不符合posix(不在我的AIX上工作),但最好的行動路線時 – NeronLeVelu

+0

@NeronLeVelu'GNU sed是好的' – Kent

0

隨着awk這是簡單的事:

awk '!f && /FAA/ {f=1;next}1' file 
1. foo bar quuz 
3. quuz quuz FAA (this should remain) 
4. quuz FAA bar (this should also remain) 
1
sed '1 {/FAA/ d;};1,/FAA/ {/FAA/d;}' YourFile 

FAA對第一行的情況下需要特殊的測試(或它採取第一發生和下一個)

替代

sed '/FAA/ !b 
    N;s/.*\n// 
:end 
    N 
    $ p 
    b end' YourFile 
+0

有趣,我在評論@ hek2mgl的回答後纔看到這個答案。 sed有0個地址。這個問題可能會更容易。 – Kent

+0

我想在特殊情況下,你的'1 {...}'部分,你需要以某種方式做一個'next'。否則,如果#1和#2線都具有「FAA」,則兩條線都將被移除。 – Kent

+0

@Kent是正確的,請嘗試'printf'1. a FAA \ n2。b FAA \ n3。cc dd \ n「| sed -e'1 {/ FAA/d;}; 1,/ FAA/{/ FAA/d;}''。只顯示第三行。 – gioele

3

這可能適合你(GNU sed):

sed -n '/FAA/{:a;n;p;ba};p' file 

打印所有行,直到遇到FAA,然後跳過該行並將所有後續行打印到文件末尾。

+0

仍然非常乾淨和短小,喜歡你的風格 – NeronLeVelu

0
sed '0,/FAA/{//d}' file 

查看詳細=>信息的sed