regex - regular - ¿Por qué un espacio causa que el patrón recordado en sed genere cosas diferentes?
sed substitute (1)
Como puede ver, la diferencia es el uso del patrón codicioso .*
en la segunda expresión regular después de "
sin espacio".
Motivo por el que se comporta de manera diferente porque hay una comilla doble después de que no_but_why=
también y .*
ser un patrón codicioso coincide hasta el último "
antes />
en la segunda expresión regular.
En su primera expresión regular "/(.*/)"
"bob3"
solo con "bob3"
porque hay un espacio después de esto que hace que el motor regex evite .*
Coincidencia hasta la última comilla doble en la entrada.
Para evitar esta situación , debería usar una clase de caracteres negada en lugar de una concordancia ambiciosa.
Considere estos ejemplos de comando sed:
sed -e ''s/.*value="/([^"]*/)" .*//1/'' <<< "$abcs"
bob3
sed -e ''s/.*value="/([^"]*/)".*//1/'' <<< "$abcs"
bob3
Ahora puede ver que ambos comandos están produciendo la misma salida bob3
porque la clase de caracteres negada [^"]*
coincidirá hasta que llegue la siguiente "
no hasta el último "
en la entrada como en el caso de .*
.
Estoy tratando de obtener el valor de la entrada de valor en esta línea xml a través del terminal, así que estoy usando sed.
abcs=''<param name="abc" value="bob3" no_but_why="4"/>''
echo $abcs | sed -e ''s/.*value="/(.*/)" .*//1/''
echo $abcs | sed -e ''s/.*value="/(.*/)".*//1/''
El resultado es:
bob3
bob3" no_but_why="4
¿Por qué la segunda vía sin el espacio causa más que solo lo que quería que se imprima? ¿Por qué el / 1 se vería afectado por eso?