Tengo un archivo alphanum
con estas dos líneas:
123 abc
this is a line
Estoy confundido sobre por qué, cuando ejecuto sed 's/[a-z]*/SUB/' alphanum
, obtengo el siguiente resultado:
SUB123 abc
SUB is a line
Yo estaba esperando:
123 SUB
SUB is a line
Encontré una solución (uso sed 's/[a-z][a-z]*/SUB/'
en su lugar), pero no entiendo por qué funciona y el mío no.
¿Puede usted ayudar?
sed
regular-expression
Fakher Mokadem
fuente
fuente
ls foo*
que usa allí). Pero de todos modos, si encuentra preguntas que son duplicadas, creo que también debería poder marcarlas como tales.Respuestas:
El patrón
[a-z]*
coincide con cero o más caracteres en el rangoa
dez
(los reales personajes son dependientes de la localización actual). Hay cero caracteres de este tipo al comienzo de la cadena123 abc
(es decir, el patrón coincide), y también cuatro de ellos al comienzo dethis is a line
.Si necesita al menos una coincidencia, use
[a-z][a-z]*
o[a-z]\{1,\}
, o habilite expresiones regulares extendidas consed -E
y use[a-z]+
.Para visualizar dónde coincide el patrón, agregue paréntesis alrededor de cada coincidencia:
O, para ver todos los partidos en las líneas:
Compare ese último resultado con
fuente
[a-z]
coincide con elementos de clasificación que pueden estar formados por más de un personaje. Por ejemplo, en algunos locales húngaros,[a-z]
partidos endzs
Porque
*
coincide con cero o más repeticiones del átomo anterior, y todos los motores de expresiones regulares intentan encontrar la primera coincidencia. Hay una subcadena de exactamente cero letras al comienzo de su cadena, por lo que es donde coincide. En el caso de que la cadena comience con una letra,*
coincide tanto como sea posible, pero esto es secundario para encontrar la coincidencia más a la izquierda.Las coincidencias de longitud cero pueden ser un poco problemáticas y, como viste, la solución es modificar el patrón para que requiera al menos un carácter. Con expresiones regulares extendidas, podrías
+
para eso:sed -E 's/[a-z]+/SUB/'
Por diversión, prueba:
fuente