2017-07-11 2 views
0

ich eine Eingabedatei „test.txt“ haben, wie unten -Bash - Suchen und Ersetzen Betrieb mit den Dateien und Linien berichten, die sich geändert hat

host = abc.com host = xyz.com 
db-host = abc.com db-host = xyz.com 

In jeder Zeile ist der Wert vor dem Raum der alte Wert die ersetzt werden muss durch den neuen Wert nach Leerzeichen rekursiv in einem Ordner namens "test"

"sed" ersetzt die Zeichenfolgen im laufenden Betrieb in 100s Dateien.

Gibt es einen Trick oder eine alternative Möglichkeit, mit der ich einen Bericht über die geänderten Dateien erhalten kann wie der absolute Pfad der Datei & die genauen Zeilen, die geändert wurden?

PS - Ich verstehe, dass sed oder Stream-Editoren diese Funktionalität nicht von Anfang an unterstützen. Ich möchte keine Versionierung verwenden, da dies für diese Aufgabe ein Overkill sein wird.

+0

Mit etwas wie Git Ich denke nicht, ist überhaupt übertrieben. Es ist schnell und einfach einzurichten und hat einen kleinen "Fußabdruck". Mach einfach "git init" und du bist weg. Genau das brauchst du auch. –

+0

Ich muss das Shell-Skript für diese Aufgabe verwenden. Ich bin nur in ** Suche & Ersetzen ** Funktion fest. –

+0

Sie benötigen Daten, z. B. Schlüssel = letzte_Wert in derselben Datei oder in anderer Datei? – syadav

Antwort

0

Sie können dies leicht erreichen mit perl:

find -type f -iname '*.txt' -exec perl -i -lape 'if (/.+\s=\s.+\s.+\s=\s.+/) {s/.+\s=\s.+\s(.+\s=\s.+)/\1/; push (@lines, $_);} END {if (@lines) {print STDOUT "\n" . $ARGV . ":"; foreach (@lines){print "$_";}}}' {} \; 

Aufteilung:

find -type f -iname '*.txt' Look für Dateien im aktuellen Verzeichnis und das Unter, dessen Dateinamen enden in .txt

-exec den folgenden Befehl ausführen für jede gefundene Datei

perl -i -lape an Ort und Stelle bearbeiten Sie Dateien nach dem folgenden perl Skript.

if (/.+\s=\s.+\s.+\s=\s.+/), wenn die Linie das Muster entspricht, das Sie haben: xxx = xxx xxx = xxx wo x ein beliebiges Zeichen

{s/.+\s=\s.+\s(.+\s=\s.+)/\1/; suchen und ersetzen, nur den zweiten Teil der

push (@lines, $_);} fügen Sie die bearbeitete Zeile auf einen Array Linie zu halten

END Nachdem alle Zeilen in der Datei verarbeitet wurden, gehen Sie wie folgt vor:

if (@lines) dies nur tun, wenn es irgendwelche modifizierten Zeilen in der Datei waren

{print STDOUT "\n" . $ARGV . ":"; drucken eine leere Zeile, dann ist die durch ein Semikolon gefolgt Dateiname

foreach (@lines){print "$_";}}} Druck jeder Zeile, die modifiziert in dieser Datei war

{} \; Dies ist ein Platzhalter für die find Ergebnis