2011-04-09 16 views
16

Me gustaría encontrar líneas en los archivos que incluyen dos palabras, word_1 y word_2 con el fin, por ejemplo en Line A a continuación, pero no como en Line B o Line C:expresiones regulares ACK: Coincidencia de dos palabras en el orden en la misma línea

Line A: ... word_1 .... word_2 .... 
Line B: ... word_1 .... 
Line C: ... word_2 .... 

he tratado

$ack '*word_1*word_2' 
$ack '(word_1)+*(word_2)+' 

y los mismos comandos con ^ anexado al comienzo de la expresión regular (en un intento de seguir la sintaxis de expresiones regulares de Perl).

Ninguno de estos comandos devuelven los archivos o las líneas Me interesa.

¿Qué estoy haciendo mal?

Gracias!

Respuesta

31

Desea encontrar word_1, seguido de cualquier cosa, cualquier número de veces, seguido de word_2. Eso debería ser

word_1.*word_2 

Usted parece estar utilizando * ya que se utiliza a menudo en las búsquedas de línea de comandos, pero en expresiones regulares que es un cuantificador para el carácter anterior, es decir, igualaremos al menos 0 veces. Por ejemplo, la expresión regular a* coincidiría con 0 o más a s, mientras que la expresión regular a+ coincidiría con al menos un a.

El metacarácter expresiones regulares que significa "juego cualquier cosa" es ., por lo .* significa "coincide con cualquier cosa, cualquier número de veces. Ver perlrequick para una breve introducción sobre el tema.

+0

Gracias @dsolimano! ¿Habría alguna diferencia entre lo que escribiste y: '. * word_1. * word_2'. Si no, ¿por qué? –

+1

Más o menos, pero no por lo que estás viendo. Eso además coincidiría todo antes de' word_1' en la línea. Si estabas buscando en lo que coincida, en lugar de si coincide o no, verás más cosas en el partido. Si tienes algo de dinero y tiempo, te recomendaría leer "Mastering Regular Expressions" de Friedl, es excelente. – dsolimano

Cuestiones relacionadas