2013-10-01 55 views
1

我正在尋找修剪文件,我需要在第二個匹配(以及第一個匹配之前的所有內容)後刪除所有內容。在第二個模式sed後刪除線

例如說我有這樣的文字:

xxx xxx 
yyy yyy 
New USB device found 
xxx xxx 
yyy yyy 
zzz zzz 
New USB device found 
xxx xxx 
yyy yyy 

如果我用下面的命令sed

sed -i '1,/New USB device found/d' <FILE> 

這消除了第一場比賽之前的一切。這是偉大的:

New USB device found 
xxx xxx 
yyy yyy 
zzz zzz 
New USB device found 
xxx xxx 
yyy yyy 

但我只有1/2的方式存在,現在我想在第二節比賽後,除去一切得到這樣的結果:

New USB device found 
xxx xxx 
yyy yyy 
zzz zzz 

因此只爲數據第一個設備。

+0

一個真正的低等級的方法是隻保留計數一個循環。 \t \t貓$ CHUNK \t \t回聲 「啓動」 \t \t C = 0 \t \t而讀艾琳;做 \t \t \t如果[ 「$(回聲$ {艾琳} | grep的 '新USB設備發現')」];然後 \t \t \t \t((C + = 1)) \t \t \t音響 \t \t \t [[$ c -lt 2]] && echo「out:$ aline」 \t \t done <$ {CHUNK} –

回答

6

這AWK的一行應該給你想要的東西:

awk '/New USB device found/{p++}p==1' file 

與您的數據測試:

kent$ awk '/New USB device found/{p++}p==1' file 
    New USB device found 
    xxx xxx 
    yyy yyy 
    zzz zzz 
+0

謝謝。這對我有用! \t \t \t \t awk'/ New USB device found/{p ++} p == 1'$ {CHUNK}> $ {TMPFILE} –

2

如果你有GNU awk則:

$ awk 'NR==2{print RS,$0}' RS='New USB device found' file 
New USB device found 
xxx xxx 
yyy yyy 
zzz zzz 

只是比較您要打印的記錄號碼是NR。這使得打印第112條記錄就像打印第4條記錄一樣簡單,只需將NR==2更改爲NR==112NR==4即可。

+0

實際上,如果他想要第112條記錄,他必須使用NR == 113 –

+0

@glennjackman再次查看OP示例數據。記錄出現在分隔符之前,因此實際上第112條記錄確實是'NR == 112'時,除非OP錯誤地省略了第一個記錄分隔符。 –

+2

我確切地知道你在說什麼,但是我認爲OP在考慮「第一個想要的塊」是在第一個RS –

1

這裏有一個SED解決方案:

sed -i '1,/New USB device found/d; /New USB device found/,$d' <FILE> 
+0

可以縮短爲'sed -i'1,/^New/d;/^ New /,$ d'' – Conner

+1

這一個也會刪除第一個模式。 – Birei

+0

OP解決方案的上半部分也刪除了第一個模式,所以我認爲這是可以接受的。 –

1

使用SED:

sed -n '/New/{:a;p;n; /New/!ba}' input 
相關問題