2009-03-04 6 views
2

Ich habe ein einfaches Skript geschrieben, das ein Perl-Programm aufruft, um Dateien zu finden und zu ersetzen. Die übergebene in arg ist das Home-Verzeichnis:Wie kann ich Änderungen, die während der direkten Bearbeitung in Perl vorgenommen wurden, aufzeichnen?

perl -pi -e 's/find/replace/g' $1/*.html 

Es funktioniert gut. Ich möchte jedoch alle Änderungen in einer Protokolldatei ausgeben. Ich habe versucht, zu leiten und umzuleiten und konnte es nicht funktionieren. Irgendwelche Ideen?

Danke, Glenn

+0

Können Sie klarstellen, was Sie unter "die Änderungen" verstehen? Was sollte in der Protokolldatei angezeigt werden? – chaos

+0

Ich denke, der Dateiname zusammen mit der gesamten Zeile (n) enthält die Suchzeichenfolge vor dem Ersetzen. Es sei denn, Sie haben bessere Vorschläge. Vielleicht würde nur der Dateiname mit der Zeilennummer ausreichen. –

+0

Beide Antworten funktionieren ähnlich. Ich wählte den, der zuerst beantwortet wurde. Danke für die Hilfe Jungs. –

Antwort

8

So etwas wie dies alle Änderungen an STDERR senden:

perl -pi -e '$old = $_; s/find/replace/g and warn "${ARGV}[$.]: $old $_"; close ARGV if eof' $1/*.html 

Aktualisiert: Fest $. auf mehreren Dateien.

+0

Danke, ich werde es heute Abend versuchen. Fragen Sie sich nur, ob Sie die Variablen erklären können? denkfauls Lösungen leiten die Ausgabe an logfile.txt weiter. In Ihrer Lösung bin ich mir nicht sicher, welche Variable auf die Logdatei zeigt. Und ich werde die gleiche Frage stellen, die ich getan habe, um in Bezug auf die Verwendung von Perl ... –

+0

"warnen" Ausgaben an STDERR, so dass Sie es in eine Protokolldatei umleiten können, genau wie in denkfauls Antwort. "$ ARGV" ist der Name der aktuellen Datei, "ARGV" ist das Dateihandle, $ _ ist die aktuelle Zeile, $. ist die aktuelle Zeilennummer. Siehe "perldoc perlvar" und "perldoc -f eof" – runrig

+0

Ausgezeichnet. Vielen Dank. Und hast du im zweiten Teil die Frage, auf die ich mich bezog, gesehen: "Wäre die Lösung einfacher oder logischer, wenn ich von einem ksh-Skript auf ein natives Perl-Skript umschalte?" –

3

Sie können zu STDERR drucken und leiten nur die STDERR Ausgabe in eine Datei wie folgt:

perl -pi -e 'chomp($prev=$_);s/find/replace/g and print STDERR "$ARGV - $.: $prev -> $_"; close ARGV if eof' $1/*.html 2> logfile.txt 

edit: hinzugefügt, um den Dateinamen und die Festnetznummer angezeigt, wenn mehrere Eingabedateien verwendet werden

+0

Ehrlich, ich dachte an die eof-Sache, kam hierher zurück, um einen Schnitt zu machen, und bemerkte, dass du schon deinen geändert hast :-) – runrig

+0

keine Sorgen :) Ich hätte deine Kommentare anfangs hinzugefügt, anstatt eine ähnliche Antwort zu erstellen , aber ich habe noch nicht den Vertreter: | – denkfaul

+0

Danke, ich werde es heute Abend versuchen. Wäre die Lösung einfacher oder logischer, wenn ich von einem ksh-Skript zu einem nativen Perl-Skript wechseln würde? –

Verwandte Themen