Manipulando texto en el terminal

Conforme te vas adentrando en el uso del terminal te vas dando cuenta de todas las posibilidades que ofrece, y lo mas impresionante de todo es que siempre te sorprende. Una de las características que hasta la fecha no había explorado suficientemente era la manipulación de texto en el terminal.

Aunque, esto de manipular texto en el terminal te puede sonar extraño, o que raramente lo vas a utilizar… nada mas lejos de la realidad. Una de las operaciones mas habituales que haces en el terminal es cambiar el nombre o la extensión a un archivo. Eso lo puedes hacer manualmente, pero ¿que pasa cuando tienes que renombrar de forma masiva 10 archivos?¿y si en lugar de ser 10 son 100 o 1.000?…. ¿Si tienes 1.000 imágenes en formato JPEG y las quieres convertir a PNG?

En este artículo te mostraré algunas de las posibilidades que te ofrece bash para manipular texto. Esto lo vamos a ver mediante algunas recetas verdaderamente útiles sobre edición de texto en el terminal.

Manipulando texto en el terminal

Manipulando texto en el terminal

Empezando por lo básico

Lo primero, veamos algunos elementos básicos,

  • Para averiguar la longitud de una cadena ${#cadena}
cadena="ejemplo"
echo ${#cadena}
7

Mayúsculas y minúsculas

  • Convertir una cadena a minúsculas ${cadena,,}
cadena="EJEMPLO"
echo ${cadena,,}
ejemplo
  • Convertir solo la primera letra de una cadena a minúsculas ${cadena,}
cadena="EJEMPLO"
echo ${cadena,}
eJEMPLO
  • Convertir una cadena a mayúsculas ${cadena^^}
cadena="ejemplo"
echo ${cadena^^}
EJEMPLO
  • Convertir solo la primera letra de una cadena a mayúsculas ${cadena^}
cadena="ejemplo"
echo ${cadena^}
Ejemplo

Subcadenas

  • Extraer una subcadena
cadena="ejemplo"
echo ${cadena:4}
plo
echo ${cadena:1:2}
je
echo ${cadena:(-2)}
lo

Sustituyendo texto

  • Reemplazar parte de una cadena
cadena="imagen.png"
echo ${cadena/.png/.jpg}
imagen.jpg
  • Reemplazar todas las apariciones de una subcadena en una cadena
cadena="Supercalifragilisticexpialidocious"
echo ${cadena/i/a} # Solo reemplazamos la primera aparición de `i` en la cadena
Supercalafragilisticexpialidocious
echo ${cadena//i/a} # Reemplazamos todas las apariciones de `i` en la cadena
Supercalafragalastacexpaaladocaous
  • Quitar todas las apariciones de una subcadena en una cadena
echo ${cadena//i}
Supercalfraglstcexpaldocous
  • Si solo queremos quitar la primera aparición
echo ${cadena/i}
Supercalfragilisticexpialidocious

Quitando texto…

  • Si queremos quitar parte del texto desde el principio. Con esta primera opción quitamos la parte mas corta…
cadena="Supercalifragilisticexpialidocious"
echo ${cadena#Super}
califragilisticexpialidocious
echo ${cadena#*r}
califragilisticexpialidocious
  • Mira la diferencia entre eliminar la parte mas corta de eliminar la parte mas larga
cadena="Supercalifragilisticexpialidocious"
echo ${cadena#*i}
fragilisticexpialidocious
echo ${cadena##*i}
ous
  • Estas mismas operaciones las podemos hacer por la parte de atrás, es decir por el final de la cadena de texto
cadena="Supercalifragilisticexpialidocious"
echo ${cadena%i*}
Supercalifragilisticexpialidoc
echo ${cadena%%i*}
Supercal

A por las recetas de edición de texto en el terminal

Ahora vamos a ver algunas recetas en las que la edición de texto en el terminal nos va a ser de mucha utilidad, y sobre todo, nos va a ahorrar trabajo.

Convertir imágenes de formato

Para esta primera receta utilizaremos la herramienta convert. Esto nos va a permitir convertir todas las imágenes que se encuentren en el directorio, del formato JPEG al formato PNG

for i in *.jpg;do convert "$i" "${i/.jpg/.png}";done

Otra opción para hacer lo mismo…

for i in *.jpg;do convert "$i" "${i%.jpg}.png";done

Recuerda poner las ” comillas, de esta manera evitarás el problema con los espacios en blanco en los nombres de los archivos.

La diferencia entre la primera y la segunda opción se encuentra en que en el primer caso si dentro del nombre del archivo se encuentra la subcadena .jpg, ya tenemos el problema. Por ejemplo,

beach-2952391_1280.jpg.jpg
beach-2952391_1280.png.jpg # Utilizando el primer método
beach-2952391_1280.jpg.png # Utilizando el segundo método

Una de audio….

La primera de las recetas nos permitirá convertir audio del formato OGG al formato MP3

for i in *.ogg; do ffmpeg -i "$i" "${i%.*}.mp3"; done

La segunda de las recetas nos permitirá extraer el audio de archivos de vídeo,

for i in *.mkv; do ffmpeg -i "$i" -vn -ab 128k -ar 44100 -y "${i%.*}.mp3"; done

Modificando los títulos de los capítulos de tu serie preferida

Desde hace tiempo que vengo utilizando el siguiente formato para guardar los capítulos de mi serie preferida, titulo de la serie – SXXEYY.mkv donde SXXEYY se refiere a la temporada XX episodio YY. Aquí tienes toda una variedad de opciones. Algunos ejemplos

01 - nombre de la serie.mkv
for i in *.mkv; do mv "${i:5:-4} - S01E${i:0:2}.mkv" ; done
nombre de la serie - S01E01.mkv

¿Y si quieres que esté toda en mayúsculas?

01 - nombre de la serie.mkv
for i in *.mkv; do j=${i^^}; mv "${j:5:-4} - S01E${j:0:2}.mkv" ; done
NOMBRE DE LA SERIE - S01E01.mkv

Lo mismo podríamos hacer para el caso de minúsculas… o capitalizando texto.

01 - nombre de la serie.mkv
for i in *.mkv; j="${i:5:-4} - S01E${i:0:2}.mkv";j="${j^}; mv "$i" "$j"; done
NOMBRE DE LA SERIE - S01E01.mkv

Conclusión

Como puedes ver las opciones y posibilidades que tienes para manipular texto en el terminal, y en concreto para renombrar, editar y modificar los nombres de los archivos, son muy variadas. Esto te da todo un amplio abanico de posibilidades para realizar tareas masivas.

Sin embargo, te recomiendo que todo esto lo conviertas en scripts. Al final tendrás un conjunto de sencillos scripts con los que habrás automatizado parte de las tareas mas habituales que haces. Lo cierto es que o estás habituado a utilizar el terminal, y lo haces frecuentemente o difícilmente recordarás todas estas opciones.