Perl: Suchen und ersetzen Sie bestimmte Zeichenfolge in Multiple-Text-Datei

8

Ich muss alle .config-Datei in einem bestimmten Verzeichnis abrufen und in jeder dieser Dateien muss ich nach einer bestimmten Zeichenfolge suchen und durch eine andere ersetzen, basierend auf der Datei.

Zum Beispiel, wenn ich 3 Dateien im angegebenen Verzeichnis habe:

%Vor%

Bitte lassen Sie mich wissen, wie dies in Perl gemacht werden kann?

Unten ist der Code, den ich beim Shell-Scripting ausprobiert habe:

%Vor%     
user2589079 15.11.2013, 07:05
quelle

6 Antworten

20

Wenn Sie auf einer Unix-ähnlichen Plattform arbeiten, können Sie Perl in der Befehlszeile verwenden; Sie müssen kein Skript schreiben.

%Vor%

Um auf der sicheren Seite zu sein, möchten Sie vielleicht den Befehl mit der Backup-Option verwenden.

%Vor%     
Pankaj Vaidya 15.11.2013 08:39
quelle
9

Perl ist hier nur zum Ändern von Dateien ... Ich verstehe nicht, warum man es in Perl komplett schreiben soll, wenn man es viel einfacher machen kann:

%Vor%     
jirib 15.11.2013 08:37
quelle
2

Falls Sie das wirklich nur mit Perl machen müssen, was ich nicht empfehlen kann, da es bereits ausgezeichnete und einfachere Antworten gibt, geht hier:

%Vor%

Bitte beachten Sie, dass dies mit einfachen Such- und / oder Shell-Platzhaltern viel einfacher ist. Aber nehmen Sie dies als ein kleines Tutorial zur Verarbeitung von Dateien mit Perl sowieso.

    
Sami Laine 15.11.2013 08:42
quelle
1

Obwohl es über die Befehlszeile ausgeführt werden kann, möchten Sie manchmal einfach ein leicht verwendbares Skript, das eine etwas nützlichere Ausgabe bietet. In diesem Sinne ist hier eine Perl-Lösung mit freundlicher Ausgabe für jeden, der diese Frage durchläuft.

%Vor%     
simpleuser 22.12.2014 23:19
quelle
0

Vielleicht wird das folgende hilfreich sein:

%Vor%

Ein Hash von Arrays (HoA) wird von split in den Zeilen | -determined DATA erstellt, wobei der Schlüssel der Dateiname und der Wert eine Referenz auf ein anonymen Array ist, dessen zwei Elemente für die Ersetzung vorgesehen sind auf der Datei. Die Schreibweise local $^I = '.bak' erstellt Backups der Originaldateien.

Möglicherweise müssen Sie die Substitution anpassen. Zum Beispiel werden Wortgrenzen in der Substitution beobachtet, indem \b in s/\b\Q$replacements{$file}[0]/$replacements{$file}[1]/g; verwendet wird. Sie können oder wollen nicht das.

Ich schlage vor, dass Sie zuerst nur eine "Scratch" -Datei ausprobieren, um sicherzustellen, dass Sie die gewünschten Ergebnisse erhalten, bevor Sie sie vollständig implementieren - obwohl die Originaldateien gesichert sind.

    
Kenosis 15.11.2013 19:54
quelle
0

Dein Skript ist ein guter Versuch.

Es enthält einige Redundanzen:

  • es ist nutzlos für cp $f
  • $TFILE ist ebenfalls nutzlos (schreibe einfach die sed -Ausgabe direkt in die Zieldatei)

Sie können $NEW und den Zieldateinamen aus dem Wert von $f ohne den Verzeichnispfad erstellen, den Sie wie folgt erhalten:

%Vor%     
reinierpost 23.12.2014 08:08
quelle

Tags und Links