Quiero buscar todos los archivos dentro de un directorio y sus subdirectorios en busca de líneas que contengan una cadena determinada, pero quiero excluir aquellos resultados que contengan una cadena determinada diferente en la línea inmediatamente posterior.
Por ejemplo, esto:
foo1 searchString bar
foo1 excludeString bar
foo2 searchString bar
something else
foo3 searchString bar
foo3 excludeString bar
foo4 searchString bar
debería devolver esto:
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar
Sé que -A
imprime varias líneas, y eso -v
excluye los resultados. Pero mi enfoque actual de grep -r -A 1 "searchString" | grep -v "excludeString"
obviamente no puede funcionar.
¿Hay alguna manera de decirle al segundo grep que también debe eliminar la línea anterior si encuentra una coincidencia? ¿O de alguna otra manera podría lograr esto?
El rendimiento no es mi principal preocupación; Sin embargo, sería bueno que el comando fuera relativamente fácil de recordar.
Respuesta aceptada:
Puedes usar p
erl c
r
compatibles regular e
xpresiones grep
:
$ pcregrep -M '(searchString.*\n)(?!.*excludeString)' file
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar
Busca searchString
seguido de cualquier carácter .
, repetido cero o más veces *
, seguido de una nueva línea \n
solo si hay no (?!
) patrón .*excludeString
junto a él. Opción -M
está presente para hacer coincidir varias líneas.