sed no distingue entre coincidencia completa de expresiones regulares y ninguna coincidencia

sed no distingue entre coincidencia completa de expresiones regulares y ninguna coincidencia

Quiero extraer parte de una cadena que coincida con una expresión regular. Considere el siguiente código que funciona correctamente:

regex="ss"
string="blossom"
echo $string | sed "s/^.*\($regex\).*$/\1/"

La salida es:

ss

Sin embargo, si la expresión regular no coincide con nada, se devuelve la cadena completa.

regex="aa"

Producción:

blossom

Esto es incorrecto. Cuando no hay coincidencia, no se debe devolver nada. ¿Cómo se puede lograr esto?

Respuesta1

Como dijo choroba, sed siempre imprimirá la línea, de forma predeterminada, con cualquier sustitución que coincida. Podrías hacer lo que quieras con:

regex="ss"
string="blossom"
echo $string | sed -n "s/^.*\($regex\).*$/\1/p"

-n le dice a sed que no imprima la línea, luego p al final del comando s/ le dice a sed que imprima la línea, con reemplazos, si coincide con algo.

Respuesta2

Tu interpretación es incorrecta. Dijiste sedreemplazar algo por otra cosa; Si no encontró nada para reemplazar, ¿por qué debería eliminar nada? En otras palabras, la sustitución reemplaza lo que coincide, no toca las líneas que no coinciden. O otra reformulación más: sed reemplazó correctamente todas las líneas que aacontienen aa.

Respuesta3

el comportamiento de sed es correcto, imprime la cadena de entrada EDITADA. obviamente, si nada coincide en la cadena de entrada con el token dado, el resultado es la cadena de entrada tal como está. cuando regex="aa" el token evaluado no coincide y se imprime = "blossom".

Respuesta4

Lo siguiente debería funcionar si desea prescindir del uso de 'sed':

[[ $string == *$regex*  ]] && echo $regex

información relacionada