Suchen und Ersetzen Skript auf Basis einer externen Datei

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Sidewinder, 27.09.2006.

  1. #1 Sidewinder, 27.09.2006
    Sidewinder

    Sidewinder Grünschnabel

    Dabei seit:
    27.09.2006
    Beiträge:
    4
    Zustimmungen:
    0
    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Wolfgang, 27.09.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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
     
  4. Lumpi

    Lumpi Haudegen

    Dabei seit:
    14.06.2006
    Beiträge:
    663
    Zustimmungen:
    0
    Ort:
    Dessau
    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
     
  5. #4 Sidewinder, 27.09.2006
    Sidewinder

    Sidewinder Grünschnabel

    Dabei seit:
    27.09.2006
    Beiträge:
    4
    Zustimmungen:
    0
    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.
     
  6. #5 Wolfgang, 27.09.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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
     
  7. #6 Sidewinder, 28.09.2006
    Sidewinder

    Sidewinder Grünschnabel

    Dabei seit:
    27.09.2006
    Beiträge:
    4
    Zustimmungen:
    0
    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.

    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.
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  9. #7 Sidewinder, 28.09.2006
    Sidewinder

    Sidewinder Grünschnabel

    Dabei seit:
    27.09.2006
    Beiträge:
    4
    Zustimmungen:
    0
    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.
     
  10. #8 Wolfgang, 28.09.2006
    Zuletzt bearbeitet: 28.09.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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.
    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.

    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...
    Nein, ist nicht anders. Siehe meinen Hinweis auf Adressbereich von sed.
    Auch werden durch single Quote keine Shellvariablen aufgelöst.
    Das versteh ich nicht wirklich. Was bedeutet extern gescriptet?


    Gruß Wolfgang
     
Thema:

Suchen und Ersetzen Skript auf Basis einer externen Datei

Die Seite wird geladen...

Suchen und Ersetzen Skript auf Basis einer externen Datei - Ähnliche Themen

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

    [Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter: Hallo zusammen, ich bin an einem Punkt angekommen, wo ich nicht mehr weiter komme und hoffe ihr könnt mir weiter helfen. Anbei ein Ausschnitt aus...
  2. sed suchen und ersetzen mit Variable übergeben?

    sed suchen und ersetzen mit Variable übergeben?: hallo, ich habe folgenden sed-Befehl, der schon super ist und auch alles tut, was er tun soll, nur eben natürlich das $i einfach hinschreibt...
  3. Zeilenweise suchen, löschen und ersetzen / Inhalt einfügen

    Zeilenweise suchen, löschen und ersetzen / Inhalt einfügen: Hallo liebe Community. Habe ein kleines Problem und bin leider nicht so der Linux-Freak... Ich hoffe mal ihr könnt mir da vielleicht ein wenig...
  4. Bash-Skript Text suchen und ersetzen mit unterschiedlichen Trennzeichen

    Bash-Skript Text suchen und ersetzen mit unterschiedlichen Trennzeichen: Hallo zusammen, ich habe bereits diverse Google-Suchergebnisse durchforstet, habe jedoch nirgendwo eine verwertbare Lösung für mein Anliegen...
  5. Maskiertes Suchen, Ersetzen und Rechnen in access.log vor weitere Bearbeitung

    Maskiertes Suchen, Ersetzen und Rechnen in access.log vor weitere Bearbeitung: Hallo, vielen Dank nochmal für die konstruktive Hilfe in meiner letzten Anfrage. Aktuell zu meinem kleinen Auswertungsprojekt habe ich eine...