
Tengo un archivo llamado "prueba" que contiene
linux
Unixlinux
Linuxunix
it's linux
l...x
Ahora, cuando lo uso grep '\<l.*x\>'
, coincide:
linux
it's linux
l...x
pero cuando lo uso grep '\<l*x\>'
, solo coincide:
l...x
, pero de acuerdo con la guía de referencia, cuando se usa * , el elemento anterior coincidirá cero o más veces, es decir, debe coincidir con cualquier cosa que comience con 'l' y termine con 'x'.
¿Alguien puede explicar por qué no muestra el resultado deseado o si lo he entendido mal?
Respuesta1
notación (.*)
El * en las expresiones regulares .* y * se refiere a un recuento, no a caracteres en sí, más exactamente significa'cero o más'. Además, el.medio'cualquier carácter'.
Así que cuando los juntas obtienes'cero o más de cualquier carácter'. Por ejemplo cadenas como estas:
- Linux
- linnnnnx
- lnx
- hola linux
- lx
Sería igualado por <l.*x>
. El último es importante, muestra que el.*tampoco puede igualar nada.
notación (*)
El uso de * solo, como dije, es un contador. Entonces, cuando lo pones después de una letra como'yo'el * esta diciendo'cero o más de l'.
Observe que si buscamos l*x
, esto coincidirá l...x
, pero probablemente no por el motivo que cree.
% echo "l...x" | grep "l*x"
l...x
Coincide con la 'x' final. La 'l' no tiene nada que ver con el motivo por el que esto coincide, aparte del hecho de que la 'x' está precedida por'cero o más unos'.
Respuesta2
Si desea hacer coincidir algo que comience con "l" y termine en "x", pruebe con la expresión regular "l.*x". Aquí "." y "*" son caracteres especiales que representan un único carácter válido y caracteres de al menos cero longitud, respectivamente. Aquí lo que precede a "*" es un ".", por lo que cualquier cosa que venga en lugar de "." se repite de acuerdo con la definición de "*" según lo anterior.
Respuesta3
Para el shell (por ejemplo, bash), cuando los comodines se usan para hacer coincidir nombres de archivos *
y ?
son los personajes mismos, representan los personajes.
Por otro lado, para las expresiones regulares, *
, ?
, {n,m}
(rango de apariciones) y +
( egrep
solo) no son nada en sí mismos. Siempre se refieren al personaje/átomo anterior; si se trata de un personaje real (p. ej. L
o 5
), el .
(comodín) que puede representar cualquier personaje, un rango de caracteres (p. ej. [a-f]
) o un patrón de varios caracteres (solo egrep; p. ej. (abba)
- donde "abba" se considera una unidad). Los *
y ?
por lo tanto no representan nada por sí solos, pero dicen algo sobre cuántas veces debe repetirse el personaje anterior (que puede ser un comodín para cualquiera o un grupo tratado como una unidad).
Una vez que recuerde esta distinción, entre la forma en que Shell y Regex usan *
y ?
, debería encajar.
Entonces para expresiones regulares:
.
- representar exactamente una aparición de cualquier caráctera..a
- coincide con dos a con dos caracteres de cualquier tipo entre.*
- coincide con 0, 1 o más apariciones de cualquier personajeB*
- coincide con 0, 1 o más apariciones de "B"