grep une ligne avant le match plus le match

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

dans la ligne ci-dessus, je veux grep / sed / awk (toute méthode est bien) ligne qui ont & signe plus une ligne au-dessus d'eux. donc par exemple la sortie souhaitée ressemblera à:

 aaaaaaaaa bbbbbbbbb & ccccccccc & eeeeeeeee fffffffff & ggggggggg & 

voici ce que j'ai essayé sans succès.

 egrep "&" | -b 1 file.txt 

Tu peux faire:

 grep -B 1 '&$' your_file 

Ceci searchra les lignes se terminant par & , supprimera $ pour correspondre aux lignes avec & n'importe où dedans.

Le commutateur -B indique à grep de sortir les lignes "context" qui précèdent les lignes qui correspondent. Dans ce cas, puisque vous voulez une ligne de context, vous avez besoin de -B 1 .

Ce commutateur est disponible dans GNU grep mais n'est pas dans le standard POSIX.

Voici une solution sed simple qui devrait aider au cas où vous n'avez pas GNU grep :

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

Comment ça marche

  • Le commutateur -n supprime l'action par défaut "print" de sed
  • /&/!N signifie: si la ligne actuelle ne contient pas & , ajoutez la ligne suivante à l'espace du motif.
  • /&/p signifie: faire correspondre et imprimer l'espace du motif.

Voici comment émuler grep -B1 avec sed :

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

C'est très similaire à celui ici . Tout comme l'autre, il se lit sur la ligne N ext mais cette fois-ci, il indique au premier \n ewline si l'espace du motif correspond , puis, comme l'autre, D elete au premier \n ewline et redémarre le cycle. Donc, avec votre input d'échantillon:

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

les sorties:

 aaaaaaaaa bbbbbbbbb & ccccccccc & eeeeeeeee fffffffff & ggggggggg & 

Encore une fois, pour voir comment cela fonctionne, ajoutez l avant et après le N pour regarder l'espace de model ::

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

par exemple avec un file d'exemple:

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

ce sont les commands que sed exécute et la sortie correspondante:

  cmd sortie 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 \nl 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