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