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.
¿Qué es el comando tr?
el linux tr
El comando es una utilidad rápida y sencilla para eliminar caracteres no deseados de flujos de texto y para otros trucos de manipulación ingeniosos. Recibe su nombre de la palabra «traducir», y tr
Las raíces de se encuentran profundamente arraigadas en la tradición 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
tener múltiples transformaciones aplicadas a la secuencia.
Sustitución de personajes
El tr
El comando opera en su flujo de entrada de acuerdo con las reglas. Utilizado 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.
Comandos a tr
por lo general 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 para tr
, y reemplace cada aparición con la letra «z». Tenga en cuenta que tr
distingue entre mayúsculas y minúsculas.
estamos usando echo
para insertar un texto en tr
.
echo 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».
echo 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 'call me Ishmael.' | 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 el -t
(truncar) opción. Esto solo reemplaza aquellos caracteres contenidos en el conjunto uno que tienen un carácter coincidente en el conjunto dos.
echo 'call me Ishmael.' | tr -t 'abcdjklm' '123'
Uso de rangos y tokens
El conjunto uno y el conjunto dos pueden contener rangos de caracteres. Por ejemplo, [a-z]
representa todas las letras minúsculas, y [A-Z]
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 "How-To Geek" | tr '[a-z]' '[A-Z]'
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 "How-To Geek" | tr '[A-Z]' '[a-z]'
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 cartas.
- [:digit:]: Sólo 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 minusculas.
- [: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 "How-To Geek" | tr '[:lower:]' '[:upper:]'
echo "How-To Geek" | tr '[:upper:]' '[:lower:]'
Invertir los partidos
El -c
La opción (complemento) coincide con todos los caracteres excepto los del primer conjunto. Este comando convierte todo excepto la letra «c» en un guión » -
“.
echo 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 guión » -
» personaje.
echo abcdefc | tr -c 'ac' '-'
Eliminación y compresión de caracteres
Nosotros podemos usar tr
para eliminar caracteres por completo, sin ningún reemplazo.
Este comando utiliza el -d
(eliminar) opción para eliminar cualquier aparición de «a», «d» o «f» del flujo de entrada.
echo 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 el -s
(apretar-repetir) opción. 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 "a b c de f c" | tr -s '[:blank:]'
Es un poco confuso que el [:blank:]
token representa el carácter de espacio, y el [:space:]
token representa 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 "a b c de f c" | tr -s '[:space:]'
Eliminación de caracteres
Las diferencias entre [:blank:]
y [:space:]
se hacen evidentes cuando eliminamos caracteres. Para hacer esto, usamos el -d
(eliminar) y proporcione un conjunto de caracteres que tr
buscará en su flujo de entrada. Cualquiera que encuentre se elimina.
echo "a b c de f c" | tr -d '[:blank:]'
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 "a b c de f c" | tr -d '[:blank:]'
Esta vez no comenzamos una nueva línea después de la salida, el símbolo del sistema está pegado a ella. Esto es porque [:space:]
incluye líneas nuevas. 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 "a b c de f c" | tr -d ' '
Podemos eliminar dígitos con la misma facilidad.
echo abcd123efg | tr -d '[:digit:]'
Al combinar el -c
(complemento) y -d
(eliminar) opciones podemos eliminar todo excepto los dígitos.
echo abcd123efg | tr -cd '[:digit:]'
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 de terminación.
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 'one two three four' | tr ' ' 'n'
También podemos cambiar el delimitador que separa las palabras. Este comando sustituye los dos puntos ” :
” para espacios.
echo 'one two three four' | 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. un colón” :
” separa cada camino. Los cambiaremos a caracteres de nueva línea.
echo $PATH
echo $PATH | 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 convertirlo en una sola línea.
cat files.txt
cat lines.txt | tr 'n' ' '
Uso de tr con tuberías
Podemos usar la salida de tr
como entrada para otro programa, o incluso para tr
sí mismo.
Este comando utiliza tr
cuatro veces.
- La primera
tr
elimina los guiones «-» de la entrada. - El segundo
tr
comprime los espacios repetidos en espacios individuales. - El tercero
tr
reemplaza los espacios con caracteres de subrayado «_». - La cuarta y última
tr
convierte la cadena a minúsculas.
echo "Mangled FiLE-nAMe.txt" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '[:upper:]' '[:lower:]'
RELACIONADO: Cómo usar tuberías en Linux
Lo simple es lo simple que lo hace
El tr
comando es genial 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
vamos a hacer lo que necesita sin tener que buscar herramientas más complicadas como sed
.
Sin embargo, si tiene dificultades para hacer algo con tr
y te encuentras construyendo largas cadenas de comandos, probablemente deberías estar usando sed
.