wc -L gibt eine Zeilenlänge von 8 für ein Tabulatorzeichen an. Bug oder Feature?


12

-List eine nützliche Funktion von wc, oder so dachte ich. Es wird die Länge der längsten Zeile gedruckt. Aus irgendeinem Grund wird ein Einzelbyte-Tabulatorzeichen auf eine Länge von 8 erweitert.
Gibt es eine Möglichkeit, dies so einzustellen, dass der Tabulator nicht "erweitert" wird? und was könnte der grund für diese erweiterung sein?

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

Ausgänge 8

wc (GNU Coreutils) 7.4
GNU Bash, Version 4.1.5


Das -n ist orthogonal zur Frage.
Benutzer unbekannt

Antworten:


11

Ich finde keinen diesbezüglichen Fehlerbericht und die folgenden Zeilen in der Quelldatei wc.c

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

Es scheint, dass Sie sich absichtlich für dieses Verhalten entscheiden, wahrscheinlich um einen Hinweis auf die Breite zu geben, die für die Anzeige der Datei auf dem Bildschirm erforderlich ist.

Eine schnelle Alternative könnte sein

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

2
Dank an Enzo, ich habe jetzt herausgefunden, dass, obwohl man wcdieses Problem nicht erwähnt wird, es in info coreutils 'wc invocation'(das 'Mann' bezieht sich auch) angegeben ist ... Auch nachdem ich die Google-Sphäre ein bisschen mehr durchforstet habe, habe ich dies als Alternative gefunden echo -n $'\t' | expand -t1 | wc -L, das ist so ziemlich das Gleiche wie Ihre Alternative, aber ich habe es für ein gutes Maß reingeworfen. Und obwohl der folgende Link ein wc-Hack * zum erneuten Kompilieren ist , kann er für einige von Interesse sein: wc-Unterstützung für verschiedene Tabulatorbreiten
Peter.O

1

Normalerweise wird ein Tabulator bis zur nächsten Position (teilbar durch 8) +1 erweitert [1, 9, 17, 25, ...]. Wenn Sie also danach fragen, erhalten Sie es.

Beachten Sie, dass das -n für die Frage irrelevant ist, das $ jedoch nicht.

echo foo$'\t' | wc -L

wird auch 8 zurückgeben, weil

echo foo$'\t'bar 
foo     bar

Sie können das $ weglassen, wenn Sie -e für echo verwenden:

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

Wenn Sie also das '\ t' als einzelnes Byte zählen möchten, lassen Sie einfach -e und $ weg:

echo '\t' | wc -L
2

Ja, Tabs erweitert ist häufig genug für eine gedruckte / angezeigten Ausgabe, aber ich fand es seltsam , dass ein Programm , das zählt Bytes und Worte zählen würden 1 Charakter als etwas anderes als ein Zeichen ... btw echo '\t'nicht ausgibt ein Tab-Zeichen (\ x09). Es wird eine Zeile ausgegeben, deren Länge 2 ist, d. H. a '\'und a 't'. Ein Zeilenumbruch ist nicht Teil einer Zeilenlänge ... (Ich hatte -nin meinem Beispiel eine, um zu prüfen, ob wceine Datei, die kein abschließendes Zeilenumbruchzeichen enthält, ordnungsgemäß verarbeitet werden würde ...)
Peter.O

wc --helpsagt: -L, --max-line-length print the length of the longest line?. Es geht nicht um Bytes, sondern um Zeilenlängen.
Benutzer unbekannt

1
Ja, es steht "drucke die Länge der längsten Zeile" ... `aber es steht nicht " Wir gehen davon aus, dass Sie Tabulatoren erweitern möchten (nicht die übliche Zeichenanzahl, wie die meisten anderen Längenfunktionen) Auf diese Weise erweitern wir die Tabulatoren auf 8 Leerzeichen, unabhängig davon, auf was Ihre spezifischen Tabulatoren eingestellt sind. " ... das ist die Falle .. Es ist nicht richtig dokumentiert.
Peter.O

Wie setzt man den Reiter mit? In Bash? Außerdem: Tabulatoren werden nicht auf 8 Leerzeichen erweitert, sondern auf Positionen, echo -e foo'\t'bar | wc -Lwas zu 11 und nicht zu 14 führt.
Benutzer unbekannt

In dem obigen foo\tbarBeispiel wcwird angenommen , Tabula stoppt bei einem nominalen Abstand von 8 ... Das folgende Beispiel zeigt , wie wcdie aktuell aktiven Tab-Stopp - Einstellungen ignoriert. Es gibt eine Zeile an das Terminal aus, die 8 Klemmenspalten breit / lang ist und dennoch wc11 enthält. In diesem Beispiel werden tabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
Tabstopps

0

Die Beschreibung war mehrdeutig. Es wird die breiteste Anzeigebreite zurückgegeben. Um die Tab-Erweiterung zu steuern, können Sie zuerst filtern expand.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.