[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Una de expresiones regulares



On Tue, Nov 22, 2016 at 03:02:51PM +0100, José Miguel (sio2) wrote:
> El lun, 21 de nov de 2016, a las 01:58:38 -0500, Carlos Zuniga dijo:
> 
> > Esto me funciona:
> > 
> >     $ cat foo
> >     dos tres cuatro
> >     uno dos tres cuatro
> >     uno dos tres cuatro cinco
> > 
> >     $ grep -E '^(\w+\s+){3}\w+$' foo
> >     uno dos tres cuatro
> > 
> 
> Gracias, pero no busco una solución, sino saber por qué la solución dada
> no es (aparentemente) solución. Una alteranativa más aprecida a la
> solución que das es esta (salvando el hecho de que como aparezcan comas
> no vale):
> 
> $ grep -E '^(\b\w+\b\s*){4}$'<<<"a bc df"
> a bc df
> 
> ¿Por qué no desecha esa línea si no hay cuatro palabras?

Quizás encontraste un bug en grep. Estuve haciendo pruebas con la 
expresión que indicas y entrega resultados cuando el número de 
ocurrencias es tres (el esperado), cuatro y cinco. Si pruebas con:

$ grep -E '^(\b\w+\b\s*){4}$'<<<"a bc df gh"

$ grep -E '^(\b\w+\b\s*){5}$'<<<"a bc df gh"

$ grep -E '^(\b\w+\b\s*){6}$'<<<"a bc df gh"

$ grep -E '^(\b\w+\b\s*){7}$'<<<"a bc df gh"

verás que ocurre algo similar.

Si pruebas con "a bc df gh jk" y cambias las coincidencias a 5, 6, 7, 8 
y 9, ocurre lo mismo.

Intenté verificar si la cadena de caracteres se modificaba de algún 
modo, pero al filtar el resultado con od, parece no haber nada anormal:

$ grep -E '^(\b\w+\b\s*){2}$'<<<"a bc df" | od -bc
0000000

$ grep -E '^(\b\w+\b\s*){3}$'<<<"a bc df" | od -bc
0000000 141 040 142 143 040 144 146 012
          a       b   c       d   f  \n
0000010

$ grep -E '^(\b\w+\b\s*){4}$'<<<"a bc df" | od -bc
0000000 141 040 142 143 040 144 146 012
          a       b   c       d   f  \n
0000010

$ grep -E '^(\b\w+\b\s*){5}$'<<<"a bc df" | od -bc
0000000 141 040 142 143 040 144 146 012
          a       b   c       d   f  \n
0000010

$ grep -E '^(\b\w+\b\s*){6}$'<<<"a bc df" | od -bc
0000000

Saludos.

-- 
Pablo Jiménez


Reply to: