VMware ESXi and vSphere Cluster Management

Linux expand-Befehl: Tabulatoren in Leerzeichen umwandeln

Lerne, wie du mit expand unter Linux Tabulatorzeichen in Leerzeichen umwandelst, Tabstopps festlegst, Pipes nutzt und die Ausgabe sicher speicherst.

Der Linux-Befehl expand ersetzt Tabulatorzeichen durch Leerzeichen. Das ist hilfreich, wenn Textdateien eine einheitliche Darstellung ohne Tabs benötigen oder von Werkzeugen verarbeitet werden sollen, die mit festen Leerzeichen besser umgehen.

expand liest Text aus einer Datei oder aus der Standardeingabe. Das Ergebnis schreibt der Befehl standardmäßig auf die Standardausgabe, also meistens in das Terminal. Die Eingabedatei wird dabei nicht direkt verändert.

Was macht expand?

Ein Tabulator ist ein Steuerzeichen für horizontalen Abstand. Er springt normalerweise zum nächsten Tabstopp, also zu einer bestimmten Spaltenposition. Ein Tabulator ist deshalb nicht automatisch dasselbe wie eine feste Anzahl von Leerzeichen.

expand berechnet anhand der aktuellen Zeichenposition, wie viele Leerzeichen bis zum nächsten Tabstopp erforderlich sind, und gibt diese Leerzeichen aus. Ein einzelnes Leerzeichen ist dagegen ein einzelnes Space-Zeichen.

Die Grundwirkung lässt sich so zusammenfassen:

Tabulatorzeichen  --expand-->  ein oder mehrere Leerzeichen

Die Anzahl der erzeugten Leerzeichen hängt von der verwendeten Tabulatorbreite und der aktuellen Spaltenposition ab. Mit der Option -t 1 kann jeder Tabulator gezielt durch genau ein Leerzeichen ersetzt werden.

Grundsyntax

expand [OPTIONEN] [DATEI ...]

Mit einer Datei liest expand deren Inhalt und zeigt die umgewandelte Ausgabe an:

expand daten.txt

Die Datei daten.txt bleibt dabei unverändert. Ohne Dateinamen liest expand aus der Standardeingabe. So kann ein anderer Befehl Text über eine Pipe liefern:

anderer-befehl | expand -t 1

Du kannst Eingabe auch interaktiv über das Terminal liefern. Der Befehl wartet dann auf Text, bis das Eingabeende signalisiert wird, beispielsweise mit Strg+D unter Linux.

Wichtige Optionen und Argumente

OptionBedeutungBeispiel
-t NLegt Tabstopps beziehungsweise die Tabulatorbreite fest.expand -t 4 daten.txt
--tabs=NLange Schreibweise für die Tabulatorbreite oder Tabstopps.expand --tabs=4 daten.txt
Dateiname als ArgumentLiest den Inhalt der angegebenen Datei.expand daten.txt
Keine DateiargumenteLiest aus der Standardeingabe, häufig aus einer Pipe.printf 'A\tB\n' | expand -t 1

Tabulatorbreite mit -t oder --tabs festlegen

Die Option -t beziehungsweise --tabs bestimmt, wie Tabulatoren erweitert werden. Ein numerischer Wert beschreibt die gewünschte Breite beziehungsweise die Positionen der Tabstopps.

Jeden Tabulator durch ein Leerzeichen ersetzen

Mit -t 1 wird jeder Tabulator als genau ein Leerzeichen ausgegeben:

expand -t 1 daten.txt

Das ist besonders praktisch, wenn Tabulatorzeichen vollständig aus einer Textdatei entfernt werden sollen. Zwischen zwei Feldern steht dann ein einzelnes Leerzeichen, unabhängig von der bisherigen Spaltenposition.

Feste Spaltenbreite verwenden

Mit -t 4 werden Tabulatoren anhand einer Breite von vier Spalten erweitert:

expand --tabs=4 daten.txt

Das Ergebnis richtet Text an Tabstopps aus, die sich an dieser Breite orientieren. Die gewählte Breite muss zur erwarteten Ausgabe und zu anderen Werkzeugen passen. Eine Anwendung, die Tabstopps mit acht Spalten darstellt, kann denselben Text anders ausrichten als eine Anwendung mit vier Spalten.

Beispiel: tabulatorgetrennte Wörter

Angenommen, daten.txt enthält zwei Zeilen. In der folgenden Darstellung steht für ein tatsächliches Tabulatorzeichen:

Name→Alter→Stadt
Anna→30→Berlin

Mit den Standardtabstopps werden die Tabulatoren in so viele Leerzeichen umgewandelt, wie bis zum nächsten Tabstopp notwendig sind:

expand daten.txt

Die Ausgabe kann beispielsweise sinngemäß so aussehen:

Name    Alter   Stadt
Anna    30      Berlin

Die genaue Zahl der Leerzeichen richtet sich nach den Spaltenpositionen. Beginnt ein Tabulator an einer anderen Position, kann er unterschiedlich viele Leerzeichen erzeugen.

Wenn jeder Tabulator nur ein Leerzeichen werden soll, verwendest du:

expand -t 1 daten.txt

Dann entspricht die Ausgabe dem Prinzip:

Name Alter Stadt
Anna 30 Berlin

Für eine feste Breite von vier Spalten kannst du schreiben:

expand -t 4 daten.txt
Eingabe mit sichtbarer Tab-MarkierungVerwendete OptionErgebnisprinzipEinsatzfall
Wort→Wort-t 1Der Tabulator wird zu genau einem Leerzeichen.Tabs vollständig durch einzelne Spaces ersetzen.
Wort→Wort-t 4Die Ausgabe orientiert sich an Tabstopps mit vier Spalten Abstand.Textspalten mit einer eigenen festen Breite ausrichten.
Wort→WortStandardverhaltenDie Ausgabe verwendet die voreingestellten Tabstopps des Programms.Eine schnelle Darstellung mit Standardformatierung.

Ausgabe in einer Datei speichern

Mit der Ausgabeumleitung > leitest du die Standardausgabe in eine Datei um. So speicherst du die umgewandelte Version, während das Original erhalten bleibt:

expand -t 1 daten.txt > daten-ohne-tabs.txt

Danach enthält daten-ohne-tabs.txt die Ausgabe ohne Tabulatorzeichen. Die Quelldatei daten.txt bleibt unverändert.

Vermeide diese direkte Umleitung auf dieselbe Datei:

expand -t 1 daten.txt > daten.txt

Die Shell öffnet die Zieldatei normalerweise schon vor dem Start von expand zum Schreiben. Dadurch kann die ursprüngliche Datei geleert werden, bevor der Befehl sie vollständig lesen konnte.

Original kontrolliert ersetzen

Wenn du die Originaldatei wirklich ersetzen möchtest, schreibe zuerst in eine temporäre Datei. Prüfe die Ausgabe und benenne sie anschließend um:

expand -t 1 daten.txt > daten.txt.tmp
mv daten.txt.tmp daten.txt

Bei wichtigen Dateien solltest du vor dem Ersetzen zusätzlich eine Sicherung anlegen. Die temporäre Datei sollte möglichst im selben Verzeichnis liegen, damit das anschließende Umbenennen zuverlässig funktioniert.

Verwendung mit Pipes und Standardeingabe

Die Standardeingabe ist der normale Eingabekanal eines Befehls. Eine Pipe verbindet die Standardausgabe eines Befehls mit der Standardeingabe des nächsten Befehls.

printf 'Name\tAlter\nAnna\t30\n' | expand -t 1

Hier erzeugt printf Text mit Tabulatoren. expand liest diesen Text über die Pipe und gibt die umgewandelten Zeilen auf der Standardausgabe aus:

Name Alter
Anna 30

Du kannst die Ausgabe einer Pipeline ebenfalls speichern:

printf 'Name\tAlter\nAnna\t30\n' | expand -t 1 > daten-ohne-tabs.txt

Verhalten und Grenzen

Tabs sind nicht dasselbe wie Leerzeichen

expand ersetzt nur tatsächliche Tabulatorzeichen. Mehrere bereits vorhandene Leerzeichen werden nicht zusammengefasst, entfernt oder neu angeordnet.

Wenn eine Datei sichtbar große Abstände enthält, kann sie daher bereits Leerzeichen statt Tabs enthalten. Eine Darstellung im Editor allein reicht nicht immer aus, um den Unterschied zu erkennen. Verwende bei Bedarf die Anzeigeoptionen deines Editors oder ein Werkzeug, das Steuerzeichen sichtbar macht.

Die aktuelle Spaltenposition beeinflusst das Ergebnis

Bei normalen Tabstopps springt ein Tabulator zum nächsten passenden Tabstopp. Steht der Cursor beispielsweise kurz vor einem Tabstopp, werden weniger Leerzeichen erzeugt als bei einem Tabulator an einer früheren Position.

Deshalb bedeutet eine Einstellung wie -t 4 nicht zwingend, dass jedes Tabulatorzeichen exakt vier Leerzeichen erzeugt. Sie legt die Ausrichtung an einer Breite von vier Spalten fest. Für exakt ein Leerzeichen pro Tabulator ist -t 1 die passende Wahl.

Nur für Textdateien verwenden

expand ist für Text gedacht. Wende den Befehl nicht auf Binärdateien wie ausführbare Programme, Bilder oder komprimierte Archive an. Das Ersetzen von Bytewerten in Binärdaten kann Dateien beschädigen.

Fehlerbehebung

Die Quelldatei scheint unverändert

Das ist das normale Verhalten: expand schreibt standardmäßig nur auf die Standardausgabe. Zeige die Ausgabe im Terminal an oder speichere sie mit einer Umleitung in einer neuen Datei:

expand daten.txt > daten-ohne-tabs.txt

Die Spalten sind falsch ausgerichtet

Wahrscheinlich passt die verwendete Tabulatorbreite nicht zur ursprünglichen Darstellung oder zur Zielanwendung. Teste eine passende Breite:

expand -t 4 daten.txt
expand -t 8 daten.txt

Prüfe die Ausgabe anschließend in dem Programm, in dem sie verwendet werden soll.

Es entstehen mehr oder weniger Leerzeichen als erwartet

Bei normalen Tabstopps hängt die Anzahl der Leerzeichen von der aktuellen Zeichenposition ab. Für genau ein Leerzeichen pro Tabulator verwendest du:

expand -t 1 daten.txt

Es bleiben große Abstände sichtbar

Die Eingabe enthält möglicherweise bereits mehrere Leerzeichen und keine Tabulatoren. expand kann solche Abstände nicht reduzieren. Prüfe, ob die Datei tatsächlich Tabulatorzeichen enthält.

Die Eingabedatei wurde versehentlich geleert

Eine Umleitung auf dieselbe Datei kann die Datei vor der Verarbeitung zum Schreiben öffnen. Verwende stattdessen eine neue oder temporäre Zieldatei:

expand daten.txt > daten-neu.txt

Erst nach einer Kontrolle solltest du die neue Datei gegebenenfalls an die Stelle des Originals verschieben.

Zusammenfassung

  • expand DATEI wandelt Tabs um und zeigt das Ergebnis auf der Standardausgabe.
  • Die Eingabedatei wird dabei nicht direkt verändert.
  • -t 1 ersetzt jeden Tabulator durch genau ein Leerzeichen.
  • -t 4 oder --tabs=4 richtet die Ausgabe an Tabstopps mit einer Breite von vier Spalten aus.
  • Ohne Dateinamen liest expand aus der Standardeingabe, etwa über eine Pipe.
  • Mit > speicherst du das Ergebnis sicher in einer separaten Datei.
  • Das Werkzeug ersetzt nur echte Tabulatorzeichen und ist für Textdateien gedacht.

Für verwandte Aufgaben können weitere Informationen zum expand-Befehl sowie Werkzeuge wie unexpand, cat, paste, pr, sed und awk hilfreich sein.