Saltar al contenido

¿Cómo imprimir cadenas separadas por TAB en bash?

Solución:

el espacio en blanco entre los dos es en realidad 5 espacios.

No, no es. No en la salida de echo o printf.

$ echo -e 'footbar' | od -c
0000000   f   o   o  t   b   a   r  n
0000010

¿Cuál es la forma correcta de forzar que la pestaña se imprima como pestaña, para que pueda seleccionar la salida y copiarla en otro lugar, con pestañas?

Este es un problema diferente. No se trata del shell sino del emulador de terminal, que convierte las pestañas en espacios en la salida. Muchos, pero no todos, hacen eso.

Puede ser más fácil redirigir la salida con pestañas a un archivo y copiarlo desde allí, o usar unexpand en la salida para convertir espacios en tabulaciones. (Aunque, para empezar, tampoco puede saber qué espacios en blanco eran pestañas, y lo convertirá todo en pestañas, si es posible). Esto, por supuesto, dependería de qué, exactamente, necesita hacer con la salida.

Como dijo ilkkachu, esto no es un problema con bash, sino con el emulador de terminal que convierte las pestañas en espacios en la salida.

Verificando diferentes terminales, putty, xterm y konsole convierten las pestañas en espacios, mientras que urxvt y gnome-terminal no lo hacen. Entonces, otra solución es cambiar terminales.

En printf '%st%sn' foo bar, printf hace salida foobar.

f, o, b, a y r son caracteres gráficos de un solo ancho.

Al recibir esos caracteres, el terminal mostrará un glifo correspondiente y moverá el cursor una columna a la derecha, a menos que ya haya alcanzado el borde derecho de la pantalla (papel en las tele-máquinas de escribir originales)), en cuyo caso puede alimentar una línea. y volver al borde izquierdo de la pantalla (ajustar) o simplemente descartar el carácter según el terminal y cómo se haya configurado.

y son dos control caracteres. (también conocido como nueva línea) es el delimitador de línea en texto Unix, pero para terminales, solo alimenta una línea (mueva el cursor una posición hacia abajo). Entonces, el controlador de terminal en el kernel lo traducirá a (volver al borde izquierdo de la pantalla), (cursor abajo) (stty onlcr generalmente activado de forma predeterminada).

le dice al terminal que mueva el cursor a la siguiente tabulación (que en la mayoría de los terminales están separados por 8 posiciones de manera predeterminada, pero también se puede configurar para que se establezca en cualquier lugar) sin llenar el espacio con espacios en blanco.

Entonces, si esos caracteres se envían a una terminal con tabulaciones cada 8 columnas mientras el cursor está al comienzo de una línea vacía, eso dará como resultado:

foo     bar

impreso en la pantalla en esa línea. Si se envían mientras el cursor está en la tercera posición en una línea que contiene xxxxyyyyzzzz, que resultará en:

xxfooyyybarz

En terminales que no admiten tabulación, el controlador de terminal se puede configurar para traducir esas pestañas en secuencias de espacios. (stty tab3).

El carácter SPC, en las tele-máquinas de escribir originales, movería el cursor hacia la derecha, mientras que la tecla de retroceso (b) lo movería hacia la izquierda. Ahora, en las terminales modernas, SPC se mueve hacia la derecha y también borra (escribe un carácter de espacio como era de esperar). Entonces el colgante de b tenía que ser algo más nuevo que ASCII. En la mayoría de las terminales modernas, en realidad es una secuencia de caracteres: , [, C.

Hay más secuencias de escape para moverse. n caracteres a la izquierda, derecha, arriba, abajo o en cualquier posición de la pantalla. Hay otras secuencias de escape para borrar (llenar con espacios en blanco) partes de líneas o regiones de la pantalla, etc.

Esas secuencias suelen ser utilizadas por aplicaciones visuales como vi, lynx, mutt, dialog donde el texto se escribe en posiciones arbitrarias en la pantalla.

Ahora, todos los emuladores de terminal X11 y algunos otros que no son X11 como GNU screen le permite seleccionar áreas de la pantalla para copiar y pegar. Cuando selecciona una parte de lo que ve en el vi editor, no desea copiar todas las secuencias de escape que se han utilizado para producir esa salida. Quieres seleccionar el texto que ves allí.

Por ejemplo, si ejecuta:

printf 'abCrACbBte[CbbDn'

Que simula una sesión de editor donde ingresas abC, vuelve al principio, reemplaza ab con AC, C con B, muévase a la siguiente tabulación, luego una columna más a la derecha, luego dos columnas a la izquierda, luego ingrese D.

Verás:

ABC    D

Es decir, ABC, un espacio de 4 columnas y D.

Si lo selecciona con el mouse en xterm o putty, se almacenarán en la selección ABC, 4 caracteres de espacio y D, no abCACB[CD.

Lo que acaba en la selección es lo enviado por printf pero posprocesado tanto por el controlador de terminal como por el emulador de terminal.

Para otros tipos de transformación, consulte la (e seguido de un acento agudo combinado) cambiado a (é la forma precompuesta) por xterm.

O echo abc que acaba siendo traducido a ABC por el conductor de la terminal antes de enviar a la terminal después de un stty olcuc.

Ahora, , igual que es uno de esos pocos caracteres de control que a veces se encuentran en archivos de texto (también en archivos de texto MSDOS y, a veces para salto de página).

Por lo tanto, algunos emuladores de terminal eligen copiarlos cuando sea posible en los búferes de copiar y pegar para preservarlos (generalmente ese no es el caso de ni aunque).

Por ejemplo, en terminales basados ​​en VTE como gnome-terminal, puede ver que, cuando selecciona la salida de printf 'atbn' en una línea vacía, gnome-terminal en realidad almacena atb en la selección X11 en lugar de a, 7 espacios y b.

Pero para la salida de printf 'atbbn', almacena a, 6 espacios y b, y para printf 'artbn', a, 7 espacios y b.

Hay otros casos en los que los terminales intentarán copiar la entrada real, como cuando selecciona dos líneas después de ejecutar printf 'a nbn' donde se conservará ese espacio de seguimiento invisible. O cuando la selección de dos líneas no incluye un carácter LF cuando las dos líneas resultan del ajuste en el margen derecho.

Ahora, si desea almacenar la salida de printf en el PORTAPAPELES X11 seleccionar, lo mejor es hacerlo directamente como con:

printf 'footbarn' | xclip -sel c

Tenga en cuenta que cuando pegue eso en xterm o la mayoría de las otras terminales, xterm en realidad reemplaza eso n con r porque ese es el personaje xterm envía cuando presionas Ingresar (y el conductor de la terminal puede traducirlo de nuevo a n).

valoraciones y reseñas

Recuerda algo, que puedes optar por la opción de valorar este escrito .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *