2012-03-16 7 views
11

Ho letto nel forum per capire come risolvere il mio problema, ma nessuno dei thread correlati è utilizzabile per me, con una conoscenza di programmazione limitata, da applicare al mio problema specifico.Sed per eliminare un intervallo di linee da una specifica linea di partita FINO a una specifica linea di corrispondenza (esclusa la riga precedente)

Il mio problema è questo: ho bisogno di eliminare le linee di immondizia che sono raggruppate in tutto il mio file, ma sono tra gruppi di linee utilizzabili. Ho cercato il manuale sed e altre fonti informative sull'eliminazione degli intervalli che corrispondono ai pattern, ma menzionano solo per eliminare UNTIL pattern match, non TILL.

Ora desidero specificare un intervallo per il quale sed cancella le righe a partire dalla prima riga che corrisponde alla linea del motivo fino alla linea che corrisponde all'altro modello. Inoltre, sed ha bisogno di riconoscere gli schemi che esistono alla fine delle linee.

Ad esempio:

line 1 
blah blah 1 
blah blah 2 
blah blah 3 
blah blah 4 
line 2 
line 3 

Risultato deve essere:

line 1 
blah blah 1 
line 2 
line 3 

Si prega di notare le molteplici linee tra linea e linea e 2. Mentre Blah Blah 1 deve rimanere, gli altri 3 necessità essere cancellato.

Grazie!

+1

+1 per domanda ben formattati, con ingresso del campione, e la potenza richiesta. In bocca al lupo. – shellter

risposta

13

Prova questa

sed -n '/line 1/{;p;n;p;};/line 2/,$p' sedTest1.txt 

#output 
line 1 
blah blah 1 
line 2 
line 3 

SED decostruita:

sed -n '/line 1/{;p;n;p;};/line 2/,$p' sedTest1.txt 
    | |  |  |  |||-> print the range 
    | |  |  |  ||-> til end of file (the '$' char) 
    | |  |  |  |-> range operator (i.e. start,end) 
    | |  |  |-> beginning of range to watch for and print 
    | |  |-> now print line, get 'n'ext, print that line 
    | |-> match the line with text 'line 1' 
    |-> don't print every line, only ones flagged with 'p' 

Leggere questo dal basso verso l'alto.

Inoltre, poiché i dati sono un esempio, E si fa riferimento ad esso come linee di immondizia, potrebbe non essere così semplice. Avrai bisogno di guardare attraverso i tutorial di sed per arrivare alla velocità.

Spero che questo aiuti.

+0

Grazie per aver condiviso la tua idea con me su come risolvere il mio problema. Attualmente non ho accesso al server su cui ho bisogno di testare questo, ma ti avvertirò una volta che ho provato. Saluti, – FlyingDutch

+0

Grazie, funziona perfettamente, molto apprezzato! – FlyingDutch

+0

Felice che mi ha aiutato. Per favore, segnalo come accettato? (Vedi http://i.imgur.com/uqJeW.png). Inoltre, se continuerai a lavorare con sed, assicurati di leggere http://www.grymoire.com/Unix/Sed.html AND per migliorare le tue capacità di elaborazione del testo, usa awk, http: //www.grymoire. it/Unix/Awk.html. In bocca al lupo! – shellter

0
$ sed -n '/line 1/{p;n;p;:a;n;/line 2/{:c;p;n;bc};ba};p' input.txt 
line 1 
blah blah 1 
line 2 
line 3 
+0

Grazie per aver condiviso la tua idea con me. Al momento non posso accedere al mio server per verificare se funziona, ma tornerò da te. Cheers – FlyingDutch

1

Questo potrebbe funzionare per voi:

sed '/line 1/,/line 2/{//!d;/line 1/N}' file 
line 1 
blah blah 1 
line 2 
line 3 

o questa (se gli intervalli non sono consecutivi):

sed '/line 1/,/line 2/{//!d;$!N}' file 
line 1 
blah blah 1 
line 2 
line 3 
+0

Sì, funziona anche come un incantesimo. Grazie – FlyingDutch