Se una riga immediatamente successiva a una partita deve essere rimossa, il tuo sed
programma dovrà considerare le partite consecutive. In altre parole, se rimuovi una riga dopo una corrispondenza che corrisponde anche, probabilmente dovresti rimuovere anche la riga successiva.
È implementato in modo abbastanza semplice, ma devi guardare un po 'indietro.
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
Funziona scambiando gli spazi hold e pattern per ogni riga letta, in modo che l'ultima riga possa essere confrontata con la corrente ogni volta. Quindi quando sed
legge una riga scambia il contenuto dei suoi buffer - e la riga precedente è quindi il contenuto del suo buffer di modifica, mentre la riga corrente viene messa in attesa.
Quindi sed
controlla la riga precedente per una corrispondenza match
e, se !
non viene trovata {
, }
vengono eseguite le due espressioni nella funzione . sed
sarà g
et lo spazio stiva sovrascrivendo spazio pattern - che significa che la linea corrente è quindi in entrambi gli spazi di attesa e pattern - e poi sarà //
controllare una corrispondenza per l'espressione regolare più recente compilato - match
- e se esso non fa match
che è p
sfilato.
Ciò significa che una riga viene stampata solo in caso contrario e la riga immediatamente precedente no . Rinuncia anche a qualsiasi scambio non necessario per sequenze di es.match
match
match
Se si desidera una versione che potrebbe eliminare un numero arbitrario di righe che si verificano dopo una match
, sarebbe necessario un po 'più di lavoro:
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... sostituisci il 5 con il numero di linee (inclusa la linea abbinata) che desideri rimuovere ...
1
2
3
4
12
13
14
21