Eliminar subcadenas de una cadena
Cuando tenemos una cadena podemos sustituir subcadenas de una manera avanzada usando patrones con ${cadena#subcadena}. que elimina la coincidencia más corta al comienzo de la cadena y ${cadena##subcadena} que elimina la coincidencia más larga al comienzo de la cadena.
#!/bin/bash string="barbicano" echo $string echo ${string#b*a} echo ${string##b*a}
Que devuelve:
barbicano rbicano no
Con ${string#b*a} elimina la coincidencia más corta del patrón, que es ba.
Con ${string##b*a} elimina la coincidencia más larga del patrón, que es barbica.
Si no usamos un comodín sino que usamos un patrón fijo, la diferencia entre ## y # desaparece:
#!/bin/bash string="barbicano" echo $string echo ${string#b*a} echo ${string##b*a}
Devuelve:
barbicano rbicano rbicano
Podemos comenzar por el final cambiando el símbolo # por %:
#!/bin/bash string="barbicano" echo $string echo ${string%a*} echo ${string%%a*}
Devuelve:
barbicano barbic b
Hasta ahora, por comodidad hemos trabajado con una cadena muy sencilla que es barbicano, pero todo lo descrito anteriormente es aplicable a cadenas largas, incluso con espacios en blanco:
#!/bin/bash string="Salió un ratón barbicano, colilargo, hociquirromo y encrespando el grueso lomo" echo $string echo ${string%a*} echo ${string%%a*}
Devuelve:
Salió un ratón barbicano, colilargo, hociquirromo y encrespando el grueso lomo Salió un ratón barbicano, colilargo, hociquirromo y encresp S
Y comenzando por el principio de una cadena larga:
#!/bin/bash string="Salió un ratón barbicano, colilargo, hociquirromo y encrespando el grueso lomo" echo $string echo ${string%a*} echo ${string%%a*}
Devuelve:
Salió un ratón barbicano, colilargo, hociquirromo y encrespando el grueso lomo arbicano, colilargo, hociquirromo y encrespando el grueso lomo icano, colilargo, hociquirromo y encrespando el grueso lomo