wc -L informa una longitud de línea de 8 para un tab-char. error o característica?


12

-Les una característica útil de wc, o eso pensé. Imprime la longitud de la línea más larga. Por alguna razón, expande un carácter de tabulación de un solo byte a una longitud de 8.
¿Hay alguna forma de configurar esto para que no "expanda" la ficha? ¿Y cuál podría ser la razón detrás de esta expansión?

echo -n $'\t' | wc -L

salidas 8

wc (GNU coreutils) 7.4
GNU bash, versión 4.1.5


El -n es ortogonal a la pregunta.
usuario desconocido

Respuestas:


11

No encuentro ningún informe de error relacionado con esto, y las siguientes líneas en el archivo fuente wc.c

    case '\t':
        linepos += 8 - (linepos % 8);

parecen elegir deliberadamente comportarse de esta manera, probablemente para dar una pista sobre el ancho necesario para mostrar el archivo en pantalla.

Una alternativa rápida podría ser

echo -n $'\t' | tr '\t' ' ' | wc -L

2
Gracias enzo, ahora he descubierto que, aunque man wcno menciona este problema, se afirma en info coreutils 'wc invocation'(que 'man' también se refiere) ... Además, después de rastrear un poco más la esfera de Google, encontré esto como una alternativa echo -n $'\t' | expand -t1 | wc -L, que es más o menos lo mismo que su alternativa, pero lo he incluido en buena medida ... Y aunque el siguiente enlace es una compilación wc hack * , puede ser de interés para algunos: soporte de wc para diferentes anchos de pestaña
Peter.O

1

Normalmente, una pestaña se expande a la siguiente posición (divisible por 8) +1 [1, 9, 17, 25, ...], por lo que si la solicita, la obtiene.

Tenga en cuenta que -n es irrelevante para la pregunta, pero $ no lo es.

echo foo$'\t' | wc -L

devolverá 8 también, porque

echo foo$'\t'bar 
foo     bar

Puede omitir $, si usa -e para echo:

echo -e '\t' | wc -L
8

Entonces, si desea contar el '\ t' como un solo byte, simplemente omita -e y $:

echo '\t' | wc -L
2

Sí, expandir las pestañas es bastante común para una salida impresa / mostrada, pero me pareció extraño que un programa que cuenta bytes y palabras cuente con 1 carácter como algo distinto de 1 carácter ... por cierto echo '\t', no genera un tab-char (\ x09). Produce una línea cuya longitud es 2, es decir. ay '\'a 't'. Una nueva línea no es parte de la longitud de una línea ... (En -nmi ejemplo, tenía que verificar si wcprocesaría correctamente un archivo que no tiene un carácter de línea nueva ...)
Peter.O

wc --helpdice: -L, --max-line-length print the length of the longest line?. No habla de bytes, sino de longitudes de línea.
usuario desconocido

1
Sí, dice "imprime la longitud de la línea más larga" ... `pero no dice " Suponemos que deseas expandir las pestañas (no el recuento de caracteres habitual, como la mayoría de las otras funciones de longitud). Oh, por el de esta manera, expandiremos las pestañas a 8 espacios, independientemente de lo que estén configuradas sus tabulaciones específicas ". ... Esa es la trampa ... No está debidamente documentado.
Peter.O

¿Cómo se configura la pestaña? En Bash? Además: las pestañas no se expanden a 8 espacios, sino a las posiciones, vea echo -e foo'\t'bar | wc -Lcuál resulta en 11, no en 14.
usuario desconocido el

En el foo\tbarejemplo anterior , wcha asumido tabulaciones en un espacio nominal de 8 ... El siguiente ejemplo muestra cómo wcignora la configuración de tabulación activa actualmente. Emite una línea al terminal que tiene 8 columnas de ancho / largo, pero wcinforma que es 11. Este ejemplo establece tabulaciones en cada 6ta columna ...tabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
Peter.O

0

La descripción de wc -L era ambigua. Devuelve el ancho de pantalla más ancho. Para controlar la expansión de pestañas, puede filtrar expandprimero.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.