ÄNDERUNG: Musste Überschrift leicht modifizieren (von Hand
), um das "Gelöst"-Kennzeichen zu setzten, da die größtmögliche Länge offenbar erreicht war. Ab der nächsten Zeile steht die Originalanfrage. Utopos, 8.5.13
Hallo zusammen,
in einem bash-Skript möchte ich Folgendes umsetzen:
1. Öffnen einer gegebenen Datei,
2. Lesen der Datei, bis ein ebenfalls gegebener Suchstring gefunden wird,
3. Ersetzen der Zeile mit dem Treffer durch einen festen neuen String.
Wir dürfen dabei davon ausgehen, dass der Suchstring höchstens einmal in der Datei vorkommt;
das Abfangen bei null Treffern traue ich mir ggf. auch noch zu. Es geht also hier v.a. um den Fall mit einem Treffer.
Das Suchen ist ohne Weiteres mit grep möglich. Da ich aber auch schreiben möchte, scheint das ein Fall für perl zu sein.
Der folgende Befehl ist getestet und tut, was ich will:
Das Herumwurschteln mit den Dateien wäre dabei noch zu ertragen. Was mir aber gar nicht gefällt, ist, dass das Skript extrem ineffizient ist: Es muss zwangsläufig alle Zeilen der Datei lesen und wieder schreiben, auch wenn die einzige Änderung bereits in einer der ersten Zeilen erfolgt ist.
Gibt es hierfür einen einfachen Weg, in einem solchen Perl-Einzeiler direkt in die Datei zu schreiben?
Ich freue mich auf Eure Vorschläge.
Hallo zusammen,
in einem bash-Skript möchte ich Folgendes umsetzen:
1. Öffnen einer gegebenen Datei,
2. Lesen der Datei, bis ein ebenfalls gegebener Suchstring gefunden wird,
3. Ersetzen der Zeile mit dem Treffer durch einen festen neuen String.
Wir dürfen dabei davon ausgehen, dass der Suchstring höchstens einmal in der Datei vorkommt;
das Abfangen bei null Treffern traue ich mir ggf. auch noch zu. Es geht also hier v.a. um den Fall mit einem Treffer.
Das Suchen ist ohne Weiteres mit grep möglich. Da ich aber auch schreiben möchte, scheint das ein Fall für perl zu sein.
Der folgende Befehl ist getestet und tut, was ich will:
Code:
touch tmpDatei
rm tmpDatei
perl -ne 'if (/suchString/) {print "Zeile ersetzt"} else {print $_}' suchDatei >> tmpDatei
rm suchDatei
mv tmpDatei suchDatei
Das Herumwurschteln mit den Dateien wäre dabei noch zu ertragen. Was mir aber gar nicht gefällt, ist, dass das Skript extrem ineffizient ist: Es muss zwangsläufig alle Zeilen der Datei lesen und wieder schreiben, auch wenn die einzige Änderung bereits in einer der ersten Zeilen erfolgt ist.
Gibt es hierfür einen einfachen Weg, in einem solchen Perl-Einzeiler direkt in die Datei zu schreiben?
Ich freue mich auf Eure Vorschläge.