# Tr (Unix)

tr es un comando de la familia de Sistemas Operativos Unix que permite el reemplazo o eliminación de un conjunto de caracteres de la Entrada estándar (stdin). Su nombre proviene de la palabra inglesa translate, que significa traducir.
Este comando necesariamente trabaja leyendo la información de la Entrada estándar y volcando el resultado directamente a la Salida estándar, no permitiendo en ningún momento que se le indique algún Archivo.
Es muy importante aclarar que tr no es compatible con codificaciones de caracters que utilicen más de 1 byte para su representación, por ejemplo Unicode y toda aquella que use esta (UTF-8). Esta limitación se debe a que el comando trabaja byte a byte en las operaciones que realiza (eliminación/reemplazo), por lo tanto el uso de dichas codificaciones hace que tr genere resultados inesperados.

## Modo de uso

La invocación del comando tr tiene la siguiente sintaxis:
* tr [PARÁMETRO]... CONJUNTO1 [CONJUNTO2]
Donde CONJUNTO1 Y CONJUNTO2 son ambos secuencias de caracteres definidas explícitamente o bien usando los conjuntos predefinidos por este comando. La característica principal de trabajo de tr es que asocia cada carácter del CONJUNTO1 con los del CONJUNTO2, salvo que la operación no requiera de este último conjunto. A continuación se detalla con un ejemplo la asociación:
* tr 'abc' '123'
En este caso se define explícitamente al CONJUNTO1 compuesto por los caracteres 'a','b' y 'c'. Mientras que el segundo compuesto por '1', '2' y '3'. En este caso tr asocia el carácter 'a' con el '1', 'b' con el '2', etc. En caso de que el primer conjunto sea menor que el segundo, la asociación se realiza con la misma lógica ignorando los sobrantes del CONJUNTO2, mientras que si se da el caso contrario de que el primer conjunto sea mayor tr asume que el último carácter del segundo conjunto estará asociado a los "sobrantes" del CONJUNTO1. Ejemplo:
* tr 'abcd' '12'
La asociación queda establecida así: 'a' con '1', y 'b','c' y 'd' con '2'. Aun así cabe la posibilidad de cambiar esta forma de asociación usando el parametró -t (ver más abajo).
Por otro lado las operaciones que podemos realizar con tr, están dadas por sus parámetros, los cuales se detallan a continuación:

### -c, -C, --complement

    Usa el complemento del CONJUNTO1. Esto significa que define al CONJUNTO1 como todos los caracteres que no se encuentran en la definición dada por el Usuario. Este parámetro es útil para indicar caracteres que no queremos que se vean afectados.

### -d, --delete

    Borra los caracteres de definidos en CONJUNTO1.

### -s, --squeeze-repeats

    Elimina la secuencia continua de caracteres repetidos, definidos en el CONJUNTO1.

### -t, --truncate-set1

    Trunca la longitud del CONJUNTO1 según la longitud del CONJUNTO2. Esto hace que si el primer conjunto es más largo que el segundo, solo sean tenidos en cuenta n primeros caracteres, siendo n la longitud de CONJUNTO2.

## Definición de conjuntos de caracteres

El comando tr permite al Usuario definir explícitamente como estará compuesto el conjunto o bien provee de una colección de caracteres y conjuntos predefinidos, que puede ser utilizados a la hora de definirlos.
La forma explícita puede constar de escribir cada carácter, o bien definir un rango indicado de la siguiente forma:
* CARACTER_INICIAL-CARACTER_FINAL
Por ejemplo conjunto 'a-g' define 'abcdefg'. La utilización de rango puede aprovecharse para definir conjuntos de mayúsculas y minúsculas, 'A-Z' y 'a-z' respectivamente, entre otros.
También podemos usar repeticiones, muy útil para la definición del segundo conjunto, de la siguiente forma:
* [CARACTER*N_REPETICIONES]
Donde carácter es algún carácter explícito o predefinido, y N_Repeticiones, es justamente el número de repeticiones que deseamos. Ejemplo 5 veces la letra a y otras 10 veces la letra b, se define así: '[a*5][b*10]'.
Ahora más allá de esta forma, contamos con algunos caracteres y conjuntos predefinidos por el comando tr:
\\ : Barra invertida.
\a : Carácter audible (Campana/Bell).
\b : Retroceso.
\f : Salto de Página.
\n : Nueva línea.
\r : Retorno de carro.
\t : Tabulador.
\v : Tabulador vertical.
[:alnum:] : Las letras y Dígitos.
[:alpha:] : Letras.
[:blank:] : Espacios en Blanco.
[:cntrl:] : Caracteres de control.
[:digit:] : Dígitos.
[:graph:] : Caracteres imprimibles, sin incluir el Espacio en Blanco.
[:print:] : Caracteres imprimibles, incluyendo el Espacio en Blanco.
[:lower:] : Letras minúsculas.
[:upper:] : Letras mayúsculas.
[:punct:] : Signos de puntuación.
[:space:] : Los Espacios en Blanco verticales y horizontales.
[:xdigit:] : Dígitos Hexadecimales.
[=CARACTER=] : todos los caracteres que sean equivalentes a CARACTER.

## Ejemplos

Se muestran a continuación algunos ejemplos sencillos del comando tr. En todos ellos la entrada de información se logra con el comando echo, aunque puede usarse cat , por ejemplo, para el procesamiento de archivos:
Reemplazar las Comillas (") por un Espacio en Blanco, y los punto y comas por el carácter de Tabulación (\t). Útil para trabajar con Archivos CSV
* $ echo '"Juan";"Pepe";' | tr '";' ' \t'
Resultado: Juan Pepe
Eliminar repeticiones de determinados caracteres, como el punto (.), signos de pregunta (?,¿) y exclamación (!,¡):
* $ echo 'Este es un simple ejemplo!!!.... Algo práctico tal vez???' | tr -s '!¡.?¿'
Resultado: Este es un simple ejemplo!. Algo práctico tal vez?
Eliminar todos los caracteres repetidos, para eso se hace uso del complemento (parámetro -c) del Conjunto:
* $ echo 'Esteeee es ooootro simple ejemplo!!!.... ' | tr -c -s ""
Resultado: Este es otro simple ejemplo!.
Reemplazar las Mayúsculas por Minúsculas, y viceversa, haciendo uso de los Conjuntos predefinidos:
* $ echo 'Hola Mundo!' | tr '[:upper:][:lower:]' '[:lower:][:upper:]'
Resultado: hOLA mUNDO!.
Reemplazar las Mayúsculas por su equivalente al Dígito correspondiente del Teclado telefónico (no está incluida la Ñ):
* $ echo 'comuníquese al 0-800-WIKI' | tr '[:upper:]' '[2*3][3*3][4*3][5*3][6*3][7*4][8*3][9*4]'
Resultado: comuníquese al 0-800-9454