grep - impression en ligne, avant, n'imprimez pas de match
Comment faire pour imprimer facilement la ligne au-dessus de la correspondance et passez le match lui-même? grep
-A
, -B
et -o
opter de ne pas le résoudre. Peut-être que certains awk
magie?
par exemple:
$ cat foo.txt
bar
foo
baz
foo
$ cat foo.txt | grep foo-SOMETHING
bar
baz
Modifier
- dans le cas où la ligne 2 et 3 a "foo", puis la ligne 1 et 2 doivent être imprimés (bien que je ne suis pas très strictes ici)
Fonction supplémentaire: prenons l'exemple:
bar
foo
baz
foo
foo
Cela devrait idéalement retour
bar
baz
foo
- Quel est le problème avec
-B
? - il imprime la ligne précédente ET la mise en correspondance de la ligne.
- qu'en est deux lignes continues match
foo
? impression de la première ligne? ou d'ignorer les deux? - Je suis conscient de cela, mais qui peut être travaillé autour de contre.
Vous devez vous connecter pour publier un commentaire.
La première clause de sauvegarde chaque non-foo ligne dans une variable. La deuxième clause de tirages enregistrée la plus récente de la ligne lorsque la ligne correspond à
foo
.Cela fonctionne aussi (et traite le cas où vous avez deux
foo
lignes en une ligne):Avec
grep
que vous pouvez faire:La deuxième commande filtre le
foo
lignes et les diviseurs qui sont imprimés entre les blocs correspondant.foo
doit être imprimé lorsqu'il est suivi d'une ligne correspondantfoo
, refactoriser àawk '/foo/{print line}{line=$0}' foo.txt
awk '/foo/{ print line } { line = $0 }' foo.txt
être suffisant?Juste mis
p
du modèle que vous voulez: