Suchen und Ersetzen Skript auf Basis einer externen Datei

S

Sidewinder

Grünschnabel
Ich habe folgendes Problem:

In einer Skriptdatei finden sich verschiedenen einmalige Werte die durch andere einmalige Werte aus einer externen Datei ersetzt werden müssen.

Beispiel:

Skriptdatei
#########

SET NTWID 2
PORT "PortA"
END

SET NTWID 2
PORT "PortB"
END
SET NTWID 2
PORT "PortC"
END

Usw.....

##########

Parallel gibt es dazu eine tabstop getrennte Listendatei

##########

PortA PortANeu
PortB PortBNeu
PortC PortCNeu

Jetzt suche ich eine Möglichkeit automatisiert über die Unix Shell jeweils die Listendatei abarbeiten zu lassen und dann die alten Werte in der Skirpt Datei immer durch den neuen Wert zu ersetzen.

Der Ablauf ist mir klar nur leider fehlt mir bei der Umsetzung das spezifische Unix Wissen um die richtigen Paramenter und Befehle dafür zu finden.

Ablauf:

- > Listendatei wird eingelesen
- > Erster Wert "PortA" wird als Variabele A gesetzt
- > Zweiter Wert "PortANeu" wird als Variable B gesetzt
- > Variable A wird in der Skript Datei gesucht und durch Variable B ersetzt.
- > Nächste Zeile der Listendatei wird eingelesen
- > Erster Wert "Port'B" wird als Variabele A gesetzt
- > Zweiter Wert "PortBNeu" wird als Variable B gesetzt
- > Variable A wird in der Skript Datei gesucht und durch Variable B ersetzt.
- > Nächste Zeile wird eingelesen

Usw....

Jemand Ideen mit welchen Befehlen/Systemprogramen man das umsetzen kann?

Danke im vorraus für Eure Hilfe....

Thomas
 
Hallo

Wenn du ein Shellscript schreiben willst, wirst du nicht um eine Beschäftigung mit dem Basiswissen herumkommen.
Wichtig immer auch:
Welche Shell verwendest du?
Welches Linux/Unix verwendest du.

Hier ein Beispiel, welches auf GNU sed basiert.
Code:
#!/bin/sh
# datei2 enthält die zu ersetzenden Wertepaare
#datei1 ist zu ändern
while read ALT NEU; 
do
	sed -i -e "/\"$ALT\"/s/$ALT/$NEU/" datei1 #GNU sed Option -i
done <datei2
cat datei1 #Testausgabe

Sonst müsstest du mit temporären Dateien arbeiten.
Ist nicht besonders ausgefeilt, und enthält womöglich meine berümten Tippfehler.
Also erst versuchen zu verstehen, was da passiert.

Gruß Wolfgang
 
....enthält womöglich meine berümten Tippfehler......
Hallo

OT:
Jeder hat da seinen Standart :)
Aber wie du schon mehrmals angebracht hast
sollte man scripte und "-fetzen" nicht einfach übernehmen.
Eine stur Übernahme könnte (manchmal) sogar gefährlich werden...
besonders wenn man nicht weis was passiert

Gruß Lumpi
 
Hallo

Wenn du ein Shellscript schreiben willst, wirst du nicht um eine Beschäftigung mit dem Basiswissen herumkommen.
Wichtig immer auch:
Welche Shell verwendest du?
Welches Linux/Unix verwendest du.

Hier ein Beispiel, welches auf GNU sed basiert.
Code:
#!/bin/sh
# datei2 enthält die zu ersetzenden Wertepaare
#datei1 ist zu ändern
while read ALT NEU; 
do
	sed -i -e "/\"$ALT\"/s/$ALT/$NEU/" datei1 #GNU sed Option -i
done <datei2
cat datei1 #Testausgabe

Sonst müsstest du mit temporären Dateien arbeiten.
Ist nicht besonders ausgefeilt, und enthält womöglich meine berümten Tippfehler.
Also erst versuchen zu verstehen, was da passiert.

Gruß Wolfgang

Also das System ist ein HP-Unix mit KSH als Shell. Es handelt sich um ein Netzmanagement-System für Übertragungstechnik.

Hab mich mit dem grundsätzlichen Skripten schon ein wenig beschäftigt aber mir fehlt halt noch die Tiefe.

Hab hier gerade in Unix Buch vor mir liegen und schaue mir den Befehl "sed" näher an scheint ein gute Lösung zu sein.

Danke denke die Syntax kann ich mit dem Buch nachvollziehen. Werde das ganze Morgen mal probieren.
 
Hallo

Also mit HP-Unix hatte ich noch nie zu tun.

Wenn die Dateien sehr groß sind, ist mein Verfahren aber sehr langsam, da für jeden gefundenen Wert die 1. Datei komplett eingelesen und neu erstellt wird.

Dei sed (oder hast du GNU sed portiert?) kennt eventuell nicht die Option -i (insert).
Du müsstest also erst eine temp-File erstellen, dann den Inhalt verschieben.
Wenn die Datei nicht riesig ist, aber doch ein paar MB hat, solltest du eventuell die zweite Datei vorher in ein Array einlesen und die Elemente manipulieren, um am Ende die Datei auszugeben.
Dafür wäre ein Hash ideal.
Deshalb:
Eventuell nutzt du doch lieber Perl, damit ließe sich das performanter realisieren. (hash)
Ich wollte dir nur eine Möglichkeit vorschlagen.

Gruß Wolfgang
 
Denke Deine Möglichkeit ist recht plausibel und sollte funktionieren.

Die Datei ist nicht allzu gross.

Also es sollte was dauern aber egal das ist eine Sache die nur einmalig eingesetzt wird aber da die halbe Nacht Nach-Arbeit spart nach der Umschaltung ;-).

Der SED Befehl sollte funktionieren und die -i insert Funktion hatte ich nach Deinem Beitrag bereits gefunden.

Muss jetzt nur den Ablauf und die Syntax ermitteln wie man bei HP Unix den zu suchenende Wert und den zu ersetzenden angibt.

sed -i -e "/\"$ALT\"/s/$ALT/$NEU/"

Wenn ich das jezt richtig verstehe dann suche und ersetze ich den Wert über den Part richtig:

/s$ALT/&NEU/

Wofür ist aber dann dieses:

"/\"$ALT\

genau?



Sorry das ich sowas nachfragen muss aber arbeite mich parallel ein wenig im learning by doing in die Sache ein.


Habe bisher immer extern gescriptet und dann fertige Skriptdatein für das Netzmanangement System bereitgestellt. Verstehe also den Ablauf habe aber leider wenig Ahnung von den Befehlen.
 
Also die Suchen Ersetzen Problematik so das ich einen vorher durch Variablen definierten Wert durch einen anderen definierten Wert ersetze habe ich gelöst.

Hier schon mal danke an alle die Syntax auf der KSH ist ein wenig anders

sed - e 's/WERT1/WERT2' DATEI

// Ersetzt in DATEI den WERT1 durch WERT2

Wie kann ich jetzt die Listendatei einlesen und dann jeweils immer diesen SED String mit den Variablen einer Zeile einbinden.

Kann ich per SED einen Textauszug holen diesen definieren sprich Beginn der Zeile bis Tapstop und als Variabel 1 definieren. Dann das selbe mit nach dem Tabstop auf Variabel 2.


Schon mal vielen Dank für den Tipp mit dem SED.
 
Wenn ich das jezt richtig verstehe dann suche und ersetze ich den Wert über den Part richtig:

/s$ALT/&NEU/

Wofür ist aber dann dieses:

"/\"$ALT\

genau?
Code:
 sed -i -e "/\"$ALT\"/s/$ALT/$NEU/"
"/\"$ALT\"/ ist der Adressbereich, für welchen ...
s/$ALT/$NEU/" ...die Ersetzung vorgenommen wird.
Das bedeutet, es wird nur ersetzt, wenn $ALT innerhalb von " " gefunden wird.
In deinem Beispiel würde aus :
1 Lauf
Port "PortAneu"
2. Lauf
PORT "PortANeuNeu"
...
Deshalb verwende ich den Adressbereich.
Wie kann ich jetzt die Listendatei einlesen und dann jeweils immer diesen SED String mit den Variablen einer Zeile einbinden.
Dazu habe ich dir schon ein Beispiel gebracht.
Siehe dazu auch die Manpage zu read.
Sowohl die KSH als auch die Bash trennen ihre Variablen bei read am IFS.

Kann ich per SED einen Textauszug holen diesen definieren sprich Beginn der Zeile bis Tapstop und als Variabel 1 definieren. Dann das selbe mit nach dem Tabstop auf Variabel 2.

Siehe Reguläre Ausdrücke.
Um mit sed einen Wert zwischen Tab zu matchen und als Shellvariable zu speichern:
Code:
$ WERT2=$(echo -e "Wort1\tWort2"|sed -e 's/^\([^[:blank:]]*\)[[:blank:]]\([^[:blank:]]*\)/\2/')
$ echo $WERT2
Wort2
Das echo kannst du durch eine Dateieingabe ersetzen, dient hier nur zur Veranschaulichung.
Macht aber genau das Gleiche wie
Code:
read Wort1 Wort2...

Hier schon mal danke an alle die Syntax auf der KSH ist ein wenig anders

sed - e 's/WERT1/WERT2' DATEI

// Ersetzt in DATEI den WERT1 durch WERT2
Nein, ist nicht anders. Siehe meinen Hinweis auf Adressbereich von sed.
Auch werden durch single Quote keine Shellvariablen aufgelöst.
Habe bisher immer extern gescriptet und dann fertige Skriptdatein für das Netzmanangement System bereitgestellt. Verstehe also den Ablauf habe aber leider wenig Ahnung von den Befehlen.
Das versteh ich nicht wirklich. Was bedeutet extern gescriptet?


Gruß Wolfgang
 
Zuletzt bearbeitet:

Ähnliche Themen

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

CSV Datei mit sed manipulieren/optimieren/ergänzen

suchen und ersetzen, Format erhalten

dovecot und postfix Konfiguration Problem

Werte einer Datei in Feldern einer anderen suchen

Zurück
Oben