Introducción
Tr es una utilidad de línea de comandos en sistemas Linux y Unix que traduce, elimina y comprime caracteres de la entrada estándar y escribe el resultado en la salida estándar.
El comando tr se usa típicamente junto con otros comandos a través de canalizaciones y puede realizar operaciones como eliminar caracteres repetidos, convertir mayúsculas a minúsculas y reemplazar y eliminar caracteres básicos.
En este tutorial, le mostraremos cómo usar el comando tr a través de ejemplos prácticos y explicaciones detalladas de las opciones más comunes.
Cómo usar el comando Tr
La sintaxis del comando tr es la siguiente:
tr OPTION... SET1 [SET2]
tr acepta dos conjuntos de caracteres, generalmente con la misma longitud, y reemplaza los caracteres del primer conjunto con caracteres coincidentes del segundo conjunto.
Un SET es básicamente una serie de caracteres que incluyen caracteres de escape especiales con barra invertida.
En el siguiente ejemplo, tr reemplazará todos los caracteres de la entrada noviello mapeando los caracteres del primer conjunto a los caracteres coincidentes del segundo conjunto.
echo 'noviello' | tr 'nov' 'red'
tr reemplazará cada aparición de n con r, o con e y v con d.
La salida se verá así:
redielle
Los juegos de caracteres también se pueden definir utilizando rangos de caracteres. Por ejemplo en lugar de escribir:
echo 'noviello' | tr 'nvl' 'xyz'
xoyiezzo
Puedes usar:
echo 'noviello' | tr 'ln' 'w-z'
yoviewwo
Cuando se usa la opción -c (--complement), tr reemplazará cualquier carácter que no se encuentre en SET1.
En el siguiente ejemplo, todos los caracteres que no están en SET1 serán reemplazados con el último carácter de SET2:
echo 'noviello' | tr -c 'no' 'xy'
Como habrá notado, la salida tiene un carácter más visible que la entrada. Esto se debe a que el comando echo imprime un carácter invisible \ n (nueva línea) que también se reemplaza por y. Para hacer eco de una cadena sin una nueva línea, use la opción -n.
noyyyyyoy
La opción -d (--delete) le permite eliminar los caracteres especificados en SET1.
El siguiente comando eliminará todos los caracteres especificados en SET1. Al eliminar caracteres sin comprimir, solo se puede especificar un conjunto.
echo 'noviello' | tr -d 'nol'
El carácter L no se eliminará porque la entrada incluye una letra L mayúscula mientras que el carácter l en el conjunto en minúsculas.
vie
La opción -s (--squeeze-repeats) reemplaza una secuencia de ocurrencias repetidas con el juego de caracteres en el último SET. El siguiente ejemplo eliminará los espacios repetidos:
echo "GNU \ Linux" | tr -s ' '
GNU \ Linux
Cuando se usa SET2, la secuencia de caracteres especificada en SET1 se reemplaza por SET2.
echo "GNU \ Linux" | tr -s ' ' '_'
GNU_\_Linux
La opción -t (--truncate-set1) obliga a que SET1 se trunque a la longitud de SET2 antes de realizar el procesamiento posterior.
Por defecto, si SET1 es mayor que SET2 tr reutilizará el último carácter de SET2. Aquí hay un ejemplo:
echo 'novi ello' | tr 'abcde' '12'
La salida mostrará que el carácter e de SET1 coincide con el último carácter de SET2, que es 2:
novi 2llo
Ahora use el mismo comando con la opción -t:
echo 'novi ello' | tr -t 'abcde' '12'
Se puede ver que en este caso se eliminan los últimos tres caracteres de SET1. SET1 se convierte en 'ab', la misma longitud que SET2.
novi ello
Combinación de opciones
El comando tr también le permite combinar sus opciones. Por ejemplo, el siguiente comando reemplazará todos los caracteres excepto i con 0 y luego comprimirá los 0 caracteres repetidos:
echo 'novi ello' | tr -cs 'i' '0'
0i0
Convertir letras minúsculas a mayúsculas
La conversión de minúsculas a mayúsculas o al revés es uno de los casos de uso típicos del comando tr. [: lower:] coincide con todos los caracteres en minúscula y [: upper:] coincide con todos los caracteres en mayúscula.
echo 'Noviello' | tr '[:lower:]' '[:upper:]'
NOVIELLO
En lugar de clases de caracteres, también puede usar rangos:
echo 'Noviello' | tr 'az' 'A-Z'
Para convertir mayúsculas a minúsculas, simplemente cambie la posición de los conjuntos, luego:
echo 'Noviello' | tr '[:upper:]' '[:lower:]'
noviello
Eliminar todos los caracteres no numéricos
El siguiente ejemplo eliminará todos los caracteres no numéricos de la entrada al comando tr:
echo "numero 123-456-789" | tr -cd [:digit:]
[: dígito:] representa todos los caracteres de dígitos y, al utilizar la opción -c, el comando elimina todos los caracteres que no son dígitos. La salida se verá así:
123456789
Pon cada palabra en una nueva línea
Para poner cada palabra en una nueva línea, necesitamos hacer coincidir todos los caracteres no alfanuméricos y reemplazarlos con una nueva línea:
echo 'Coding is my cardio,' | tr -cs '[:alnum:]' '\n'
Debería recibir un mensaje de salida similar al siguiente:
Coding
is
my
cardio
Eliminar líneas en blanco
Para eliminar las líneas vacías, simplemente presione los caracteres repetitivos de la nueva línea:
tr -s '\n' < mylog.txt > new_file.txt
En el comando anterior estamos usando el símbolo de redirección < para pasar el contenido del comando mylog.txt al comando tr como entrada. El redireccionamiento > escribe la salida del comando en new_file.txt.
Imprima los directorios $ PATH en una línea separada
La variable de entorno $ PATH es una lista de directorios delimitada por dos puntos que le dice al shell en qué directorios buscar archivos ejecutables cuando escribe un comando.
Para imprimir cada directorio en una línea separada, necesitamos hacer coincidir los dos puntos ( :) y reemplazarlo con la nueva línea:
echo $PATH | tr ':' '\n'
Debería recibir un mensaje de salida similar al siguiente:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin...
Conclusión
A estas alturas, debería tener una buena comprensión de cómo usar el comando tr en Linux.