wc -L riporta una lunghezza di riga di 8 per un carattere di tabulazione. bug o funzionalità?


12

-Lè una caratteristica utile di wc, o almeno così pensavo. Stampa la lunghezza della linea più lunga. Per qualche ragione espande un tab-char a byte singolo per una lunghezza di 8.
C'è un modo per impostare questo per non "espandere" la scheda? e quale potrebbe essere la logica alla base di questa espansione?

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

uscite 8

wc (GNU coreutils) 7.4
GNU bash, versione 4.1.5


-N è ortogonale alla domanda.
utente sconosciuto

Risposte:


11

Non trovo alcuna segnalazione di bug relativa a questo e alle seguenti righe nel file sorgente wc.c

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

sembrano deliberatamente scegliere di comportarsi in questo modo, probabilmente per dare un suggerimento per la larghezza necessaria per visualizzare il file sullo schermo.

Una rapida alternativa potrebbe essere

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

2
Grazie enzo, ora ho scoperto che sebbene man wcnon faccia menzione di questo problema, è indicato in info coreutils 'wc invocation'(a cui si riferisce anche 'man') ... Inoltre, dopo aver trascinato un po 'di più la sfera di google, ho trovato questo in alternativa echo -n $'\t' | expand -t1 | wc -L, che è praticamente la stessa della tua alternativa, ma l'ho inserito per buona misura .. E anche se il seguente link è un ricompilare wc hack * , potrebbe essere interessante per alcuni: supporto wc per diverse larghezze di schede
Peter.O,

1

Normalmente una scheda viene espansa nella posizione successiva, (divisibile per 8) +1 [1, 9, 17, 25, ...], quindi se la chiedi, la ottieni.

Nota che -n è irrilevante per la domanda, ma $ non lo è.

echo foo$'\t' | wc -L

restituirà anche 8, perché

echo foo$'\t'bar 
foo     bar

Puoi omettere $, se usi -e per l'eco:

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

Quindi, se vuoi contare '\ t' come un singolo byte, ometti -e e $:

echo '\t' | wc -L
2

Sì, l'espansione delle schede è abbastanza comune per un output stampato / visualizzato, ma ho trovato strano che un programma che conta byte e parole conterrebbe 1 carattere come qualsiasi cosa diversa da 1 carattere ... btw echo '\t'non genera un tab-char (\ X09). Emette una linea la cui lunghezza è 2, cioè. a '\'e a 't'. Una newline non fa parte della lunghezza di una linea ... ( -nNel mio esempio ho avuto un esempio per verificare se wcavrebbe elaborato correttamente un file che non ha newline-char in coda ...)
Peter.O

wc --helpdice: -L, --max-line-length print the length of the longest line?. Non parla di byte, ma di lunghezze di linea.
utente sconosciuto

1
Sì, dice "stampa la lunghezza della linea più lunga" ... `ma non dice " Supponiamo che tu voglia espandere le schede (non il normale conteggio dei caratteri, come la maggior parte delle altre funzioni di lunghezza) .. Oh, dal in questo modo, espanderemo le schede in 8 spazi, indipendentemente da ciò su cui sono impostate le specifiche tabulazioni ". ... Questa è la trappola .. Non è adeguatamente documentata.
Peter.O

Come si imposta la scheda con? In Bash? Inoltre: le schede non sono espanse in 8 spazi, ma in posizioni, vedere echo -e foo'\t'bar | wc -Lquale risulta in 11, non in 14.
user unknown

Nell'esempio sopra foo\tbar, wcha assunto i punti di tabulazione con una spaziatura nominale di 8 ... L'esempio seguente mostra come wcignora le impostazioni di punto di tabulazione attualmente attive. Emette una linea al terminale che è larga / lunga 8 colonne terminali, ma wcriporta che è 11. Questo esempio imposta i punti di tabulazione su ogni sesta colonna ...tabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
Peter.O

0

La descrizione del wc-L era ambigua. Restituisce la larghezza di visualizzazione più ampia. Per controllare l'espansione della scheda, puoi expandprima filtrare .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.