Sustituir caracteres en una cadena

Cuando estamos programando, ya sea en BASH o en cualquier otro lenguaje, una de las necesidades que nos vamos a encontrar muchas veces es que tenemos que modificar una cadena. Una de las modificaciones más habituales es tener que sustituir un carácter o una subcadena por otro carácter u otra subcadena. Habrá veces que tengamos que borrar un carácter o una subcadena. Esto lo haremos sustituyendo ese carácter o conjunto de caracteres por nada. Es decir, si extraemos un subconjunto de algo y no insertamos nada en su lugar, lo que hacemos es eliminar ese subconjunto.

Vamos a ver las distintas formas de sustituir caracteres y subcadenas partiendo de esta cadena:

string="Salió un ratón barbicano, colilargo, hociquirromo"

Si queremos sustituir la primera «o» por un guión bajo, podemos hacerlo escribiendo el nombre de la cadena entre llaves e indicando con una barra que queremos cambiar la primera ocurrencia de la subcadena que indicamos a continuación delimitada entre barras. Por último, indicaremos la subcadena por la que queremos cambiar ese cadena.
Lo que nos quedaría algo así:

first_o_by_underscore=${string/o/_}
echo $first_o_by_underscore

Que nos devuelve:

Salió un ratón barbican_, colilargo, hociquirromo

Nos devuelve la misma cadena pero ha sustituido la primera «o» por un «_».  De este resultado podemos concluir dos características:

  • con /subcadena_antigua/subcadena_nueva sólo se modifica la primera vez que encuentra esa subcadena.
  • en BASH es distinto carácter «ó» que «o»

Vamos a ver qué pasaría si en lugar de indicarle un carácter que tiene la cadena, le indicamos otro que no se encuentra dentro de esa cadena, por ejemplo, la «w»:

first_w_by_underscore=${string/w/_}
echo $first_w_by_underscore

Devuelve:

Salió un ratón barbicano, colilargo, hociquirromo

Por lo que vemos que si intentamos cambiar un carácter que no existe en la cadena, no realiza ninguna modificación, pero no devuelve ningún error.

Si queremos cambiar todas las ocurrencias de esa subcadena, lo que haremos será escribir dos barras entre el nombre de la cadena y la subcadena a modificar:

o_by_underscore=${string//o/_}
echo $o_by_underscore
Salió un ratón barbican_, c_lilarg_, h_ciquirr_m_

Para borrar la primera ocurrencia de un carácter, la estructura es la misma, pero sin indicarle un carácter de reemplazo, por lo que eliminará esa primera ocurrencia:

no_first_o=${string/o/}
echo $no_first_o

Que da como resultado:

Salió un ratón barbican, colilargo, hociquirromo

Del mismo modo, para eliminar todas las ocurrencias de «o», lo que haremos será escribir dos barras entre el nombre de la cadena y el carácter a eliminar. Después de la barra que delimita esa subcadena, no indicaremos un carácter de sustitución:

no_o=${string//o/}
echo $no_o
Salió un ratón barbican, clilarg, hciquirrm

Este formato nos permite también añadir texto al principio de la cadena indicándolo con # y una única barra tras el nombre de la cadena:

add_to_the_beginning=${string/#/Anexo al principio }
echo $add_to_the_beginning

Nótese el espacio en blanco al final del texto añadido en la salida:

Anexo al principio Salió un ratón barbicano, colilargo, hociquirromo

En caso de que quisiéramos cambiar en lugar de un único carácter, subcadenas completas, incluso con espacios en blanco, podemos hacerlo indicando las subcadenas en lugar de los caracteres, ya que un carácter es una subcadena de un único elemento:

replace_substring=${string/barbicano/con la barba canosa}
echo $replace_substring

Y aquí podemos comprobar cómo hace la sustitución incluso con los espacios en blanco:

Salió un ratón con la barba canosa, colilargo, hociquirromo

Para cambiar todos los caracteres antes o después de una subcadena, incluyendo la propia subcadena, lo podemos indicar con *

before_barbicano=${string/*barbicano/Apareció un roedor}
echo $before_barbicano

after_barbicano=${string/barbicano*/con la cola larga y el hocico chato}
echo $after_barbicano

Vemos cómo hace la sustitución eliminando en ambos casos la palabra «barbicano», ya que en la sustitución se incluye la subcadena:

Apareció un roedor, colilargo, hociquirromo
Salió un ratón con la cola larga y el hocico chato

2 comentarios en «Sustituir caracteres en una cadena»

Deja una respuesta

Tu dirección de correo electrónico no será publicada.