2012-03-02 13 views
48

Sono nuovo a sed e ho la seguente domanda. In questo esempio:righe di eliminazione sed che non contengono una stringa specifica

some text here 
blah blah 123 
another new line 
some other text as well 
another line 

voglio cancellare tutte le linee ad eccezione di quelli che contengono stringa 'testo' e o la stringa 'bla', quindi il mio file di output è simile al seguente:

some text here 
blah blah 123 
some other text as well 

Qualche suggerimento su come questo può essere fatto usando sed?

+3

Must la risposta usa sed? grep lo farebbe molto facilmente. – Tim

risposta

11

Si desidera stampare solo quelle righe che corrispondono a "testo" o "blah" (o entrambi), dove la distinzione tra "e" e "o" è piuttosto cruciale.

sed -n -e '/text/{p;n;}' -e '/blah/{p;n;}' your_data_file 

Il -n significa che non vengono stampati di default. Il primo modello cerca "testo", lo stampa se abbinato e salta alla riga successiva; il secondo modello fa lo stesso per 'blah'. Se la "n" non era lì, una riga contenente "testo e blah" verrebbe stampata due volte. Sebbene potrei usare solo -e '/blah/p', la simmetria è migliore, specialmente se è necessario estendere l'elenco di parole corrispondenti.

Se la versione di sed supporta le espressioni regolari estese (ad esempio, GNU sed fa, con -r), allora è possibile semplificare che a:

sed -r -n -e '/text|blah/p' your_data_file 
+3

Se sed non supporta '-r' probabilmente non supporterà' {} 'neanche. Questo dovrebbe funzionare con le vecchie sed: 'sed '/ text \ | blah /! D' file' –

+0

Il' {...} 'raggruppamento dei comandi era nella settima edizione della versione UNIX di' sed'; Non riesco a pensare a come ti saresti imbattuto in una versione in cui non era supposta. –

79

Questo potrebbe funzionare per voi:

sed '/text\|blah/!d' file 
some text here 
blah blah 123 
some other text as well 
+0

Grazie, funziona. – user1246172

+1

Come posso ad esempio specificare che testo o blah potrebbero apparire solo nell'ultima colonna? – discipulus

+2

@lovedynasty Se intendi * alla fine della riga *, dovresti usare '$': ''/ text $ \ | blah $ /! D'' – Melebius

5

si potrebbe semplicemente farlo attraverso awk,

$ awk '/blah|text/' file 
some text here 
blah blah 123 
some other text as well 
Problemi correlati