grep una riga prima della partita più la partita


8
zzzzzzzzz
aaaaaaaaa
bbbbbbbbb &
ccccccccc &
ddddddddd
hhhhhhhhh
eeeeeeeee
fffffffff &
ggggggggg &

nella riga sopra, quello che voglio è grep/ sed/ awk(qualsiasi metodo va bene) linea che ha il &segno più una riga sopra di essi. quindi ad esempio l'output desiderato sarà simile a:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

di seguito è quello che ho provato senza fortuna.

egrep "&" | -b 1 file.txt

Risposte:


16

Tu puoi fare:

grep -B 1 '&$' your_file

Questo cercherà le linee che finiscono in &, rimuoverle $per far corrispondere le linee &ovunque in esse.

Lo -Bswitch indica grepdi generare linee "di contesto" che precedono le linee corrispondenti. In questo caso, poiché si desidera una linea di contesto, è necessario -B 1.

Questo switch è disponibile in GNU grepma non è nello standard POSIX.

Ecco una sedsoluzione semplice che dovrebbe aiutare nel caso in cui non si abbia GNU grep:

sed -n '/&/!N;/&/p' your_file

Come funziona

  • L' -nopzione elimina l'azione "stampa" predefinita dised
  • /&/!Nsignifica: se la riga corrente non contiene &, aggiungi la riga successiva allo spazio del pattern.
  • /&/psignifica: abbina &e stampa lo spazio del motivo.

2
@RanaKhan Benvenuto in Stack Exchange :) Sono contento di poterti aiutare. Si prega di non dimenticare di contrassegnare questa risposta come accettata (utilizzare il segno di spunta sotto i pulsanti di voto accanto alla risposta) se ha aiutato a risolvere il problema in modo che altri utenti del sito sappiano che questo problema è stato risolto.
Joseph R.,

+1 per la variante quando GNU/grepnon è disponibile, grazie!
ckujau,

3

Ecco come emulare grep -B1con sed:

sed '$!N;/pattern/P;D' infile

È molto simile a quello qui . Proprio come l'altro, legge nella Nriga ext ma questa volta si Pstrappa fino alla prima \newline se lo spazio del modello corrisponde , quindi, come l'altro, si Delimina fino alla prima \newline e riavvia il ciclo. Quindi con il tuo input di esempio:

sed '$!N;/&/P;D' infile

uscite:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

Ancora una volta, per vedere come funziona, aggiungi lprima e dopo il Nper guardare lo spazio del modello ::

sed 'l;$!N;l;/&/P;D' infile

ad es. con un file di esempio:

zzzz &
aaaa
bbbb
cccc &
dddd &
hhhh
eeee
ffff &
gggg &

questi sono i comandi che sedesegue e l'output corrispondente:

cmd output cmd
l       zzzz &$               N # read in the next line
l       zzzz &\naaaa$         # pattern space matches so print up to \n
P       zzzz &                D # delete up to \n 
l       aaaa$                 N # read in the next line
l       aaaa\nbbbb$           D # delete up to \n (no match so no P)
l       bbbb$                 N # read in the next line
l       bbbb\ncccc &$         # pattern space matches so print up to \n
P       bbbb                  D # delete up to \n
l       cccc &$               N # read in the next line
l       cccc &\ndddd &$       # pattern space matches so print up to \n
P       cccc &                D # delete up to \n
l       dddd &$               N # read in the next line
l       dddd &\nhhhh$         # pattern space matches so print up to \n
P       dddd &                D # delete up to \n
l       hhhh$                 N # read in the next line
l       hhhh\neeee$           D # delete up to \n (no match so no P)
l       eeee$                 N # read in the next line
l       eeee\nffff &$         # pattern space matches so print up to \n
P       eeee                  D # delete up to \n
l       ffff &$               N # read in the next line
l       ffff &\ngggg &$       # pattern space matches so print up to \n
P       ffff &                D # delete up to \n
l       gggg &$               # last line so no N 
l       gggg &$               # pattern space matches so print up to \n
P       gggg &                D # delete up to \n
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.