Je souhaite rechercher dans tous les fichiers d'un répertoire et de ses sous-répertoires des lignes contenant une certaine chaîne, mais je souhaite exclure les résultats contenant une certaine chaîne différente dans la ligne qui la suit immédiatement.
Par exemple, ceci :
foo1 searchString bar
foo1 excludeString bar
foo2 searchString bar
something else
foo3 searchString bar
foo3 excludeString bar
foo4 searchString bar
devrait renvoyer ceci :
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar
Je sais que -A
imprime plusieurs lignes, et que -v
exclut les résultats. Mais mon approche actuelle de grep -r -A 1 "searchString" | grep -v "excludeString"
ne peut évidemment pas fonctionner.
Existe-t-il un moyen de dire au deuxième grep qu'il doit également supprimer la ligne précédente s'il trouve une correspondance ? Ou d'une autre façon comment je pourrais y parvenir ?
La performance n'est pas ma principale préoccupation; Ce serait bien si la commande était relativement facile à retenir.
Réponse acceptée :
Vous pouvez utiliser p
erl c
r
compatible e
régulier xpressions grep
:
$ pcregrep -M '(searchString.*\n)(?!.*excludeString)' file
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar
Il recherche searchString
suivi de n'importe quel caractère .
, répété zéro ou plusieurs fois *
, suivi d'une nouvelle ligne \n
uniquement s'il n'y en a pas (?!
) modèle .*excludeString
à côté de cela. Option -M
est présent afin de correspondre à plusieurs lignes.