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.