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 sed
reemplazar 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 aa
contienen 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