Windows 2003 Shell Scripting

Scripts zur System- und Dateiverwaltung

Textdateien nummerieren

Textdateien lassen sich per find nummerieren. Vielen Benutzern allerdings gefällt die Art der Nummerierung nicht. Sehen wir uns dazu nochmals das find-Kommando und seine Ausgabe an:

find /n /v "@@@@@" < datei.txt

[1]Eins
[2]Zwei
[3]Drei

Problematisch daran ist das fehlende Leerzeichen zwischen der Zeilenzahl und dem Text. Sie können die Ausgabe in eine neue Datei umleiten und dann mittilfe einer for-Schleife wieder auslesen (mit einem "]" als Trennzeichen). Es geht allerdings auch in einer Zeile, wenn Sie die Möglichkeit von Backquoting, Kommandogruppierung und erweiterter Variablenersetzung nutzen:

for /F "usebackq tokens=*" %f in (`find /n /v "@@@@@"^< datei.txt`) do @set line=%f & set line=!line:]= !& set line=!line:[=! & echo !line!

Dies erzeugt die unten stehende Ausgabe:

1 Eins
2 Zwei
3 Drei

Sollten Sie jetzt stirnrunzelnd auf die Befehlszeile gucken, geht es Ihnen wie einigen meiner Manuskript-Testleser, deshalb möchten wir Ihnen Schritt für Schritt erläutern, was eigentlich passiert.

  • Die Schleife führt zuerst das Kommando find /n /v "@@@@@" ^< datei.txt in einer Subshell aus. Da es sich bei dem Kleinerzeichen "<" um ein reserviertes Zeichen (für die Umleitung der Eingabe) handelt, muss es für das Backquoting mit einem ^ markiert (^ ist das Escape-Zeichen für die Shell) werden.

  • Für jede Zeile in der Ausgabe dieses Kommandos wird der Befehl nach dem do ausgeführt

  • Dieser setzt zuerst die Variable line auf den Wert der Zeile.

  • Danach wird in der Variablen die schließende eckige Klammer durch ein Leerzeichen ersetzt (set line=!line:]= !). Da die Variablen zur Laufzeit und nicht bei der Eingabe des Kommandos ersetzt werden sollen, wird hier die verzögerte Variablenexpansion angewandt (! statt %). Denken Sie daran, diese Option bei der Shell zu aktivieren (s. 34).

  • Anschließend wird noch die öffnende eckige Klammer aus dem Inhalt entfernt, in dem sie durch nichts ersetzt wird (set line=!line:[=!).

  • Als letzte Aktion wird die Variable mit dem neuen Inhalt der Zeile per echo ausgegeben.