Cómo usar el comando tr de Linux


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.

¿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 trLas 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'

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».

echo 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 'call me Ishmael.' | 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 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 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, [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]'

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 "How-To Geek" | tr '[A-Z]' '[a-z]'

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 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:]'

Uso de tokens para cambiar el caso de cadenas de texto

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' '-'

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 guión » - » personaje.

echo abcdefc | tr -c 'ac' '-'

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

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'

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 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:]'

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

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:]'

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 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:]'

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 "a  b  c    de   f   c" | tr -d '[:blank:]'

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 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 ' '

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.

echo abcd123efg | tr -d '[:digit:]'

Borrar dígitos de una cadena de texto con tr

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

echo abcd123efg | tr -cd '[:digit:]'

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 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'

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 ” : ” para espacios.

echo 'one two three four' | 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. un colón” : ” separa cada camino. Los cambiaremos a caracteres de nueva línea.

echo $PATH
echo $PATH | 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 convertirlo en una sola línea.

cat files.txt
cat lines.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 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:]'

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 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.





Source link-39