Datei auslesen, ersetzen und Kommando absetzen

S

schman

Hallo

ich bin neu hier und deshalb entschuldigt bitte falls ich einen Post schreibe den es bereits gibt, leider konnte ich keinen Thread finden der mir weiterhilft.

Folgendes versuche ich zu lösen.

Ich habe eine Datei in der mehrere Zeilen drinnen stehen welche Dateien sich geändert haben, ein typisches diff eben. Diese Datei sieht dann so aus.

PHP:
Datei ../Verzeichnis1/Pfad/zur/Datei und ../Verzeichnis2/Pfad/zur/Datei sind unterschiedlich.

das eben mehrere Zeilen. Nun würde ich gerne per Kommando diesen Pfad so umbauchen das sich dadurch ein Kommando ergibt. Es soll am Schluss folgendes rauskommen.

PHP:
diff -u ../Verzeichnis1/Pfad/zur/Datei ../Verzeichnis2/Pfad/zur/Datei > datei.diff

Ich habe gelesen das das ev. mit sed zu lösen ist, stimmt das. Gibt es eine andere Möglichkeit das zu bewerkstelligen.

Danke für eure Vorschläge und Hilfe
 
Theoretisch lässt sich das mit jeder Skriptsprache machen und evtl. gibt es auch einen Weg mit sed. Ich mag aber weder sed noch bash, daher hier ein Perl-Skript dafür. ;)

Code:
#!/usr/bin/perl

# datei in der die zu vergleichenden Dateien stehen
# die eintraege muessen folgende form haben:
# Datei ../Verzeichnis1/Pfad/zur/Datei1 und ../Verzeichnis2/Pfad/zur/Datei1 sind unterschiedlich.
# jeder eintrag muss in einer extra zeile stehen
my $input_file = 'meineliste.txt';

open(FILE, "< $input_file") or die "Konnte $input_file nicht oeffnen: $!\n";
while(my $line = <FILE>) {
    if($line =~ /Datei (.*) und (.*) sind unterschiedlich/) {
        my $cmd = "diff -u ".$1." ".$2." > datei.diff";
        print "Befehl: ".$cmd."\n";
        my $out = `$cmd`;
        print $out;
    }
}

Lässt sich natürlich nach belieben erweitern und anpassen. Man könnte z.B. noch prüfen ob wirklich nur ein Eintrag in einer Zeile steht u.ä.

Edit: Ups, da war ein 'my' an der falschen Stelle. Korrigiert.
 
Zuletzt bearbeitet:
Du kannst auch ganz einfach in der Shell mit einer while-Schleife deine Liste einlesen, mit Hilfe der Keywords überprüfen, ob die Eingabezeilen korrekt formatiert sind, und dann den diff ausführen, etwa so:
Code:
#!/bin/sh

IN=${1:-liste}
exec 3<$IN

N=0
while read DATEI F1 UND F2 SIND UNTERSCHIEDLICH <&3; do
        N=`expr $N + 1`
        [ "$DATEI" = "Datei" -a "$UNTERSCHIEDLICH" = "unterschiedlich" ] || {
                echo "$IN, line $N: incorrect format" >&2
                continue
        }
        echo "* $F1 - $F2:"
        diff -u "$F1" "$F2" 2>&1
        echo "*"
done >datei.diff

Ich habe die Ausgabe der gesamten while-Schleife nach "datei.diff" umgelenkt (und deswegen die "*"-Zeilen mit Dateinamen und Ende-Marke eingefügt); wenn du die diffs der einzelnen Dateien separat haben willst, musst du innerhalb der Schleife natürlich auch Dateinamen für die einzelnen Ausgaben konstruieren, sonst überschreibst du bei jedem Schleifendurchlauf die bisherigen Ergebnisse, und bekommst nur die diffs für die in der letzten Zeile deiner Liste aufgelisteten Dateien.

Gruss,
A.
 

Ähnliche Themen

SED: Zu bearbeitende Dateien aus Textfile einlesen

Unterschiedlichen Text in mehrere Dateien finden und löschen / ersetzen

2 Dateien Verlgeichen, Gemeinsamkeiten Exportieren

Neue ausführbare Datei mit Datensätzen aus einer Datei und Variablen erstellen

Zeilen auslesen und in eine neue Datei schreiben

Zurück
Oben