Si uno teclea líneas a la entrada estándar desde el teclado, ésta se va procesando línea por línea:
$ cat -n hola 1 hola mundo 2 mundo maravilloso 3 maravilloso ^D $
Así, resulta impráctico marcar la salida usando el ratón para copiarlo al portapapeles o simplemente para ver la salida junta. Como alternativas tenemos:
- Marcar y copiar línea por línea, acumulando el resultado en un editor antes de copiar todo el texto. Muy impráctico.
- Redirigir la salida a un archivo, pero aún queda pendiente tener que procesar y borrar el archivo después.
- Usar
tac | tac
:$ tac | tac | cat -n hola mundo maravilloso ^D 1 hola 2 mundo 3 maravilloso $
tac
es una instrucción que concatena archivos y los despliega en reversa (LIFO en lugar de FIFO por línea). Por naturaleza, tac
se ve en la obligación de leer la entrada estándar completa antes de poder mandar la primera línea de su salida. Si invertimos la entrada dos veces se obtiene el efecto deseado.
No sé hasta cuántas líneas soporte antes de volverse lento. Aquí con 10,000 líneas funciona aún bastante bien.
¿Alguien conoce alguna mejor manera?
Actualización: Dualbus me recomienda sponge
de moreutils. Ejemplo:
$ sponge | cat -n hola mundo maravilloso ^D 1 hola 2 mundo 3 maravilloso $
Según el manual, sponge
«absorbe la entrada estándar y la escribe a un archivo».