Cómo usar el comando tr de Linux

Publicado: 2023-05-17
Pantalla de inicio de Ubuntu Linux en una computadora portátil
Jordan Gloor / Instructores Geek
El comando tr realiza transformaciones en una secuencia de texto, produciendo una nueva secuencia como salida. Puede sustituir, eliminar o convertir caracteres según las reglas que establezca en la línea de comandos.

¿Necesita un método sencillo para manipular un flujo de texto en Linux? No busque más allá del comando tr, que puede ahorrarle tiempo al reemplazar, eliminar, combinar y comprimir el texto de entrada. Así es como se hace.

Tabla de contenido

¿Qué es el comando tr?
Sustitución de personajes
Uso de rangos y tokens
Invertir los partidos
Eliminación y compresión de caracteres
Eliminación de caracteres
Combinar y dividir líneas
Uso de tr con tuberías
Lo simple es lo simple que lo hace

¿Qué es el comando tr?

El comando tr de Linux es una utilidad rápida y sencilla para eliminar caracteres no deseados de flujos de texto y para otros trucos de manipulación. Obtiene su nombre de la palabra "traducir", y las raíces de tr son profundas en la tradición de Unix.

Como todos sabemos, Linux es una reescritura de código abierto de Unix. También agrega sus propias cosas a la mezcla. No es un clon byte por byte, pero claramente toma muchos de sus principios de diseño y dirección de ingeniería del sistema operativo Unix.

Aunque hasta ahora solo dos distribuciones de Linux han sido certificadas como compatibles con POSIX y aprobadas oficialmente como implementaciones de Unix (EulerOS e Inspur K-UX), Linux ha suplantado casi por completo a Unix en el mundo empresarial.

Todas las distribuciones de Linux, al menos en sus principales utilidades, se adhieren a la filosofía de Unix. La filosofía de Unix resume la visión que los pioneros de Unix tenían para su nuevo sistema operativo. A menudo se parafrasea como "Escribir programas que hagan bien una cosa". Pero hay más que eso.

Una de las innovaciones más poderosas fue que los programas deberían generar resultados que podrían usarse como entrada para otros programas. La capacidad de conectar en cadena las utilidades de la línea de comandos juntas, utilizando el flujo de salida de un programa como flujo de entrada para el siguiente programa en línea, es enormemente poderosa.

A veces querrá ajustar o ajustar la salida de un programa antes de que llegue al siguiente programa en línea. O tal vez no está tomando su entrada de una herramienta de línea de comandos de Linux, está transmitiendo texto de un archivo que no se ha creado teniendo en cuenta sus necesidades particulares.

Aquí es donde tr entra en juego. Le permite realizar un conjunto de transformaciones simples en su flujo de entrada, para producir su flujo de salida. Ese flujo de salida se puede redirigir a un archivo, alimentar a otro programa de Linux o incluso a otra instancia de tr para aplicar múltiples transformaciones al flujo.

Sustitución de personajes

El comando tr opera en su flujo de entrada de acuerdo con las reglas. Usado sin ninguna opción de línea de comando, la acción predeterminada de tr es sustituir caracteres en el flujo de entrada por otros caracteres.

Los comandos para tr generalmente requieren dos conjuntos de caracteres. El primer conjunto contiene los caracteres que se reemplazarán si se encuentran en el flujo de entrada. El segundo conjunto contiene los caracteres por los que serán reemplazados.

La forma en que esto funciona es que las ocurrencias del primer carácter en el conjunto uno serán reemplazadas por el primer carácter en el conjunto dos. Las apariciones del segundo carácter en el conjunto uno serán reemplazadas por el segundo carácter en el conjunto dos, y así sucesivamente.

Este ejemplo buscará la letra "c" en el flujo de entrada a tr y reemplazará cada aparición con la letra "z". Tenga en cuenta que tr distingue entre mayúsculas y minúsculas.

Estamos usando echo para insertar texto en tr .

 eco abcdefabc | tr 'c' 'z' 

Sustitución de un solo carácter con tr

Todas las apariciones de "c" se reemplazan con "z" y la nueva cadena se escribe en la ventana del terminal.

Esta vez buscaremos dos letras, "a" y "c". Tenga en cuenta que no estamos buscando "ac". Estamos buscando "a", luego buscando "c". Vamos a reemplazar cualquier ocurrencia de "a" con "x" y cualquier ocurrencia de "c" con "z".

 eco abcdefabc | tr 'ac' 'xz' 

Quitar dos letras con tr

Para que esto funcione, debe tener el mismo número de caracteres en ambos conjuntos. Si no lo hace, obtendrá un comportamiento predecible, pero probablemente no deseado.

 echo 'llámame Ismael.' | tr 'abcdjklm' '123' 

Uso de conjuntos de caracteres desequilibrados con tr

Hay más personajes en el conjunto uno que en el conjunto dos. Las letras "d" a "m" no tienen ningún carácter correspondiente en el conjunto dos. Todavía serán reemplazados, pero todos serán reemplazados con el último carácter en el conjunto dos.

Es posible que esto pueda ser útil en algunos casos, pero si desea evitarlo, puede usar la opción -t (truncar). Esto solo reemplaza aquellos caracteres contenidos en el conjunto uno que tienen un carácter coincidente en el conjunto dos.

 echo 'llámame Ismael.' | tr -t 'abcdjklm' '123' 

Uso de conjuntos de caracteres desequilibrados con tr con la opción truncar

Uso de rangos y tokens

El conjunto uno y el conjunto dos pueden contener rangos de caracteres. Por ejemplo, [az] representa todas las letras minúsculas y [AZ] representa todas las letras mayúsculas. Podemos hacer uso de esto para cambiar el caso de una secuencia de texto.

Esto convertirá el flujo de entrada a mayúsculas.

 echo "Cómo hacer friki" | tr '[az]' '[AZ]' 

Uso de rangos de caracteres para convertir una cadena a mayúsculas

Para cambiar el caso en la otra dirección, podemos usar el mismo comando pero con los rangos de mayúsculas y minúsculas intercambiados en la línea de comando.

 echo "Cómo hacer friki" | tr '[AZ]' '[az]' 

Usar rangos de caracteres para convertir una cadena a minúsculas

Hay tokens que podemos usar para algunos de los casos comunes con los que podríamos querer coincidir.

  • [:alnum:] : Letras y dígitos.
  • [:alpha:] : Solo letras.
  • [:digit:] : Solo dígitos.
  • [:blank:] : Tabulaciones y espacios.
  • [:space:] : Todos los espacios en blanco, incluidos los caracteres de nueva línea.
  • [:graph:] : Todos los caracteres, incluidos los símbolos, pero no los espacios.
  • [:print:] : Todos los caracteres, incluidos los símbolos, incluidos los espacios.
  • [:punct:] : Todos los caracteres de puntuación.
  • [:lower:] : letras minúsculas.
  • [:upper:] : letras mayúsculas.

Podemos realizar nuestras conversiones de minúsculas a mayúsculas y de mayúsculas a minúsculas con la misma facilidad, utilizando tokens.

 echo "Cómo hacer friki" | tr '[:inferior:]' '[:superior:]'
 echo "Cómo hacer friki" | tr '[:superior:]' '[:inferior:]' 

Uso de tokens para cambiar el caso de cadenas de texto

Invertir los partidos

La opción -c (complemento) coincide con todos los caracteres excepto los del primer conjunto. Este comando convierte todo excepto la letra "c" en un guión " - ".

 eco abcdefc | tr -c 'c' '-' 

Reemplazar todos menos los caracteres especificados con otros caracteres

Este comando agrega la letra "a" al primer conjunto. Todo lo que no sea "a" o "c" se convierte en un carácter de guión " - ".

 eco abcdefc | tr -c 'ac' '-' 

Reemplazar todos menos los múltiples caracteres especificados con otros caracteres

Eliminación y compresión de caracteres

Podemos usar tr para eliminar caracteres por completo, sin ningún reemplazo.

Este comando utiliza la opción -d (eliminar) para eliminar cualquier aparición de "a", "d" o "f" del flujo de entrada.

 eco abcdefc | tr -d 'adf' 

Eliminar varios caracteres de una cadena de texto con tr

Esta es una instancia en la que solo tenemos un conjunto de caracteres en la línea de comando, no dos.

Otra es cuando usamos la opción -s (squeeze-repeats). Esta opción reduce los caracteres repetidos a un solo carácter.

Este ejemplo reducirá las secuencias repetidas del carácter de espacio a un solo espacio.

 echo "abc de fc" | tr -s '[:en blanco:]' 

Cambiar secuencias repetidas de caracteres a una sola aparición del carácter, con tr

Es un poco confuso que el token [:blank:] represente el carácter de espacio, y el token [:space:] represente todas las formas de espacios en blanco, incluidas las tabulaciones y los caracteres de nueva línea.

En este caso, podríamos reemplazar [:blank:] con [:space:] y obtener el mismo resultado.

 echo "abc de fc" | tr -s '[:espacio:]' 

Cambiar secuencias repetidas de caracteres a una sola aparición del carácter, con tr

Eliminación de caracteres

Las diferencias entre [:blank:] y [:space:] se hacen evidentes cuando eliminamos caracteres. Para hacer esto, usamos la opción -d (eliminar) y proporcionamos un conjunto de caracteres que tr buscará en su flujo de entrada. Cualquiera que encuentre se elimina.

 echo "abc de fc" | tr -d '[:en blanco:]' 

Eliminación de espacios en blanco (caracteres de espacio) de una cadena de texto, con tr

Los espacios se eliminan. Tenga en cuenta que obtenemos una nueva línea después de escribir el flujo de salida en la ventana del terminal. Si repetimos ese comando y usamos [:space:] en lugar de en blanco, obtendremos un resultado diferente.

 echo "abc de fc" | tr -d '[:en blanco:]' 

Eliminar espacios en blanco de una cadena de texto, con tr

Esta vez no comenzamos una nueva línea después de la salida, el símbolo del sistema está pegado a ella. Esto se debe a que [:space:] incluye saltos de línea. Todos los espacios, tabulaciones y caracteres de nueva línea se eliminan del flujo de entrada.

Por supuesto, también podría usar un carácter de espacio real.

 echo "abc de fc" | tr -d ' ' 

Eliminación de espacios de una cadena de texto, especificando un carácter de espacio, con tr

Podemos eliminar dígitos con la misma facilidad.

 eco abcd123efg | tr -d '[:dígito:]' 

Borrar dígitos de una cadena de texto con tr

Al combinar las opciones -c (complemento) y -d (eliminar) podemos eliminar todo menos los dígitos.

 eco abcd123efg | tr -cd '[:dígito:]' 

Eliminar todo excepto los dígitos de una cadena de texto usando tr

Tenga en cuenta que todo, excepto los dígitos, significa todas las letras y todos los espacios en blanco, por lo que una vez más perdemos la nueva línea final.

Combinar y dividir líneas

Si sustituimos los caracteres de nueva línea por espacios, podemos dividir una línea de texto y colocar cada palabra en su propia línea.

 echo 'uno dos tres cuatro' | tr ' ' '\n' 

Dividir una línea de texto en una palabra por línea, con tr

También podemos cambiar el delimitador que separa las palabras. Este comando sustituye los dos puntos ” : ” por espacios.

 echo 'uno dos tres cuatro' | tr ' ' ':' 

Cambiando el delimitador de palabras de espacios a dos puntos, con tr

Podemos encontrar cualquier delimitador que esté en uso y reemplazarlo con caracteres de nueva línea, dividiendo el texto difícil de leer en una salida más fácil de administrar.

La variable de entorno de ruta es una cadena larga de muchas rutas de directorio. Dos puntos ” : ” separan cada camino. Los cambiaremos a caracteres de nueva línea.

 echo $RUTA
 eco $RUTA | tr ":" "\n" 

Dividir la variable de entorno $PATH en rutas de directorio separadas, una por línea, con tr

Eso es mucho más fácil de analizar visualmente.

Si tenemos una salida que queremos reformatear en una sola línea, también podemos hacerlo. El archivo “lines.txt” contiene algo de texto, con una palabra en cada línea. Introduciremos eso en tr y lo convertiremos en una sola línea.

 archivos cat.txt
 lineas de gato.txt | tr '\n' ' ' 

Combinación de entrada de varias líneas en una sola línea de texto, usando tr

Uso de tr con tuberías

Podemos usar la salida de tr como entrada para otro programa, o incluso para tr mismo.

Este comando usa tr cuatro veces.

  • El primer tr elimina los guiones "-" de la entrada.
  • El segundo tr comprime los espacios repetidos en espacios individuales.
  • El tercer tr reemplaza los espacios con caracteres de subrayado "_".
  • El cuarto y último tr convierte la cadena a minúsculas.
 echo "NOMBRE-ARCHIVO-DESTRUIDO.txt" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '[:superior:]' '[:inferior:]' 

Una canalización de cuatro instancias de tr

RELACIONADO: Cómo usar tuberías en Linux

Lo simple es lo simple que lo hace

El comando tr es excelente porque es simple. No hay mucho que aprender ni recordar. Pero su simplicidad también puede ser su ruina.

No se equivoque, con frecuencia encontrará que tr le permite hacer lo que necesita sin tener que recurrir a herramientas más complicadas como sed .

Cómo usar el comando sed en Linux
RELACIONADO Cómo usar el comando sed en Linux

Sin embargo, si tiene dificultades para hacer algo con tr y se encuentra construyendo largas cadenas de comandos, probablemente debería usar sed .