Cómo usar el comando tr de Linux
Publicado: 2023-05-17¿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.
¿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'
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'
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'
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 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]'
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]'
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:]'
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' '-'
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' '-'
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'
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:]'
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:]'
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:]'
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:]'
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 ' '
Podemos eliminar dígitos con la misma facilidad.
eco abcd123efg | tr -d '[:dígito:]'
Al combinar las opciones -c
(complemento) y -d
(eliminar) podemos eliminar todo menos los dígitos.
eco abcd123efg | tr -cd '[:dígito:]'
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'
También podemos cambiar el delimitador que separa las palabras. Este comando sustituye los dos puntos ” :
” por espacios.
echo 'uno dos tres cuatro' | 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"
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' ' '
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:]'
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
.
Sin embargo, si tiene dificultades para hacer algo con tr
y se encuentra construyendo largas cadenas de comandos, probablemente debería usar sed
.