Die Vor-Ort-Bearbeitung erlaubt Perl die Veränderung einer Datei direkt an ihrem Speicherort. Die Ausgabe muss nicht erst an ein newfile gesendet werden, wo sie wahrscheinlich sowieso nur wieder in den Originalnamen umbenannt wird. Um diese alt/neu-Ersetzung an einer Datei mit dem Namen myfile auszuführen, verwendet man das folgende Kommando:
perl -i -p -e 's/old/new/g;' myfile
Die Option -i kann optionale Parameter annehmen, die anzeigen, dass Backup-Dateien erstellt werden sollen und welche Endungen diese haben sollen. Außerdem kann man eine ganze Liste von Dateien für die Bearbeitung durch den Befehl -e angeben, anstatt nur eine einzelne Datei als Argument einzugeben. Mit diesen beiden kleinen Tricks lässt sich also ein Befehl konstruieren, der ‚Suchen und Ersetzen‘ auf alle Dateien im Home-Verzeichnis anwendet und Backup-Dateien erstellt:
find ~ -type f |xargs perl -i.bak -p -e 's/old/new/g;'
Wird er auf diese Weise eingesetzt, liefert der Befehl find eine Liste aller Dateien in und unter dem Home-Verzeichnis. Der Befehl xargs nimmt Standard-Eingaben an, in diesem Fall die Liste der Dateien, und fügt sie an den unmittelbar darauffolgenden Befehl an. Wenn man eher wagemutig gestimmt ist, kann man das .bak auslassen und so die Erstellung von Backup-Dateien unterdrücken.
Dieses Kommando mit der Option -e wird auf jede Zeile angewandt – benötigt man jedoch eine feinere Unterteilung auf Wortebene, kann man die Auto-Split-Option -a hinzufügen. Gemeinsam mit -p weist die Option -a Perl an, jede Eingabezeile an den Leerstellen in den Array @F aufzubrechen. Das Ergebnis ist das gleiche, als würde Perls Split-Kommando auf die Zeile angewandt. Diese Option kann für ein leichteres Arbeiten mit in Spalten angeordneten Daten verwendet werden. Ein Script wie:
perl -i -n -a -e 'print @F[2,4];' mychart
sieht zwar etwas kompliziert aus, ist aber leicht zu analysieren, wenn man es Stück für Stück untersucht. Die Option -i bedeutet, dass wir die angegebene Datei, in diesem Fall mychart, direkt bearbeiten werden. Das -n gibt an, dass der Befehl -e auf jede Zeile angewandt wird, aber keine Ausgabe gedruckt werden soll. Das -a ist unsere Auto-Split-Option, und der Befehl -e druckt die miteinander verketteten Inhalte der dritten und fünften Spalte (die Nummerierung beginnt bei Null).
Mit einer letzten Option -F, lässt sich das Verhalten der Auto-Split-Option so steuern, dass die Zeilen an einer beliebigen Grenze, die sich mit einem gewöhnlichen Ausdrucksmittel spezifizieren lässt, in Array-Elemente aufgebrochen werden. Ein Kommando wie dieses:
perl -i -n -a -F, -e'print join ',', @F[1..$#F];' mytable
ließe sich also verwenden, um die erste Spalte einer Tabelle mit durch Komma getrennten Werten (CSV) zu löschen. Das -i steht wieder für die Vor-Ort-Bearbeitung. Die Option -n weist Perl an, jede Zeile zu verarbeiten und nichts zu drucken. Das -a schaltet den Auto-Split ein, und das -F sorgt dafür, dass die Aufspaltung an den Kommata vorgenommen wird. Das angegebene Kommando fügt alle Daten von der ersten bis zur letzten Spalte (ein Bereich, der die Spalte Null ausschließt) wieder mit Kommata zusammen und druckt die Ausgabe.
Wie meistens bei Perl kann die Syntax der Befehle etwas kompliziert werden, die Ergebnisse sind aber großartig. Je mehr man Kommandozeilen-Perl einsetzt, um so leichter wird es. Es wird nicht allzu viel Zeit vergehen, bis man feststellt, dass man die Kommandozeilen-Switches für cut vergessen hat. Eine gute Wahl!
Neueste Kommentare
Noch keine Kommentare zu Perl vereinfacht UNIX-Administration
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.