Me gustaría obtener la coincidencia de patrón múltiple con Y implícito entre patrones, es decir, equivalente a ejecutar varios greps en una secuencia:
grep pattern1 | grep pattern2 | ...
Entonces, ¿cómo convertirlo en algo así?
grep pattern1 & pattern2 & pattern3
Me gustaría usar un solo grep porque estoy creando argumentos dinámicamente, por lo que todo tiene que caber en una cadena. El uso del filtro es una función del sistema, no grep, por lo que no es un argumento para ello.
No confundas esta pregunta con:
grep "pattern1|pattern2|..."
Este es un O coincidencia de múltiples patrones.
Respuesta aceptada:
agrep
puede hacerlo con esta sintaxis:
agrep 'pattern1;pattern2'
Con GNU grep
, cuando se crea con compatibilidad con PCRE, puede hacer:
grep -P '^(?=.*pattern1)(?=.*pattern2)'
Con ast grep
:
grep -X '.*pattern1.*&.*pattern2.*'
(añadiendo .*
s como <x>&<y>
coincide con cadenas que coinciden con <x>
y <y>
exactamente , a&b
nunca coincidiría ya que no existe tal cadena que pueda ser ambos a
y b
al mismo tiempo).
Si los patrones no se superponen, también puede hacer lo siguiente:
grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
La mejor forma portátil es probablemente con awk
como ya se mencionó:
awk '/pattern1/ && /pattern2/'
Con sed
:
sed -e '/pattern1/!d' -e '/pattern2/!d'
Tenga en cuenta que todos tendrán una sintaxis de expresión regular diferente.