substitute regular pattern regex bash shell sed regex-greedy

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?