[SOLVED] Einfache Übung: String in einer Datei ersetzen

  • Hi,
    ich möchte ein Skript schreiben welches eine Zeichenkette aus einer Datei nimmt und eine bestehende
    Zeichenkette in einer anderen Datei damit ersetzt.


    Beispiel:
    In Datei alt.txt steht der Text:
    "Dies ist der alte Text in der ersten Datei"


    In Datei neu.txt steht
    "Dies ist der neue Text in der zweiten Datei"


    Zum Schluß soll hat in alt.txt stehen
    "Dies ist der neue Text in der ersten Datei"


    ------------------------------------------------------


    Was ich herausgefunden habe:
    Mit
    grep 'Dies ist der ' alt.txt | awk '{ print $4 }'
    bekomme ich die Zeichenkette ("alte") die ersetzen möchte und mit


    grep 'Dies ist der ' neu.txt | awk '{ print $4 }'
    bekomme ich die Zeichenkette die in alt.txt eingefügt werden soll ("neue").



    Nun macht man das Ersetzen wohl mit sed...
    sed -e 's/alte/neue/g' alt.txt


    ...oder so ähnlich...



    Aber ich weiß nicht wie ich das jetzt miteinander verbinde d.h. wie muß der
    sed Aufruf lauten damit der von dem 1.grep Aufruf gelieferte Ausdruck durch den durch den 2.grep
    Aufruf ersetzt wird (und das ganze in alt.txt geschrieben wird)?


    Sorry aber in den man Pages hab ich sowas nicht gefunden...


    Gruß,
    gromit

    Mein Glotz-o-fon-Konservierer im Aufbau:
    vdr-2.3.1, v4l Treiber, OpenSuse 42.1, Satelco Easywatch DVB-C

    Einmal editiert, zuletzt von gromit ()

  • Hi Gromit,


    ich weiss zwar nicht was/ob du das machen willst, aber wenn du in einer Datei alt.txt der 4te Wort egal wo in der Datei alt.txt gegen das 4te Wort aus einer Datei neu.txt ersetzen willst, so könntest du deinen obigen Code zusammen werfen zu:


    Code
    sed -i "s/`head -n1 alt.txt| awk '{ print $4 }'`/`head -n1 neu.txt| awk '{ print $4 }'`/g" alt.txt


    (man beachte den accent grave (`) bei den Slashes)


    - Er sucht in alt.txt das Wort 'in der 4ten Spalte, 1ten Zeile' - dies wird das Suchwort für sed
    - Er sucht in neu.txt das Wort 'in der 4ten Spalte, 1ten Zeile' - dies wird das Zielwort für sed
    - Er ersetzt ALLE Vorkommen des Suchwortes durch das Zielwort - egal in welches Zeile, egal in welcher Spalte von alt.txt


    Gruß
    Skobi :)

    VDR1:Core2; 1xFF V1.6, 1xTT-1600 DVB2 + AVBoard System: Kubuntu 12.4 HD-Client: Zotac ION mit xineliboutput und XMBC auf Kubuntu 11.10

  • Die Problembeschreibung ist etwas vage. Möchtest du in der einen Datei nach einer bestimmten Wortgruppe suchen und das auf diese Zeichenkette folgende Wort kopieren? Ist die Zeichenkette die ersetzt werden soll immer das vierte Wort einer bestimmten Zeile?

  • skobi
    Vielen Dank für den Lösungsvorschlag, von Deiner Beschreibung her könnte das mein Problem lösen.
    Werde ich ausprobieren und dann berichten.


    TSkora
    Zur Problembeschreibung:
    Es ist immer das vierte Wort einer Zeile die mit einer bestimmten eindeutigen Wortgruppe beginnt. Die Zeilennummer kann verschieden sein aber die ersten drei Worte sind eindeutig.


    Gruß,
    gromit

    Mein Glotz-o-fon-Konservierer im Aufbau:
    vdr-2.3.1, v4l Treiber, OpenSuse 42.1, Satelco Easywatch DVB-C

  • skobi
    Also Deine Lösung hat zwar nicht ganz funktioniert aber mich auf die richtige Lösung gebracht.


    Die Lösung die für mich funktioniert lautet:

    Zitat


    sed -i "s/`grep 'Dies ist der ' alt.txt | awk '{ print $4 }'`/`grep 'Dies ist der ' neu.txt | awk '{ print $4 }'`/g" alt.txt


    Was ich bisher nicht wußte war, dass man mit diesen accent grave (`) Zeichen andere Befehle einbetten kann.


    Nur mal der Vollständigkeit halber:
    Der Ausdruck: head -n1 alt.txt
    gibt offenbar die erste Zeile von alt.txt aus. Der gesuchte Ausdruck steht aber in einer beliebigen Zeile die auch >1 sein kann.


    Nochmals danke für die schnelle Lösung!


    Zusatzfrage:
    Wie gebe ich Zeile x (nur diese eine Zeile) einer Datei aus?


    Gruß,
    gromit

    Mein Glotz-o-fon-Konservierer im Aufbau:
    vdr-2.3.1, v4l Treiber, OpenSuse 42.1, Satelco Easywatch DVB-C

  • Zitat

    Original von gromit
    Wie gebe ich Zeile x (nur diese eine Zeile) einer Datei aus?


    spontan fällt mir da folgendes zu ein - sicher nicht toll, aber es funzt:)


    Code
    head -n <Zeilennr> <Datei> | tail -n 1



    Skobi :)

    VDR1:Core2; 1xFF V1.6, 1xTT-1600 DVB2 + AVBoard System: Kubuntu 12.4 HD-Client: Zotac ION mit xineliboutput und XMBC auf Kubuntu 11.10

  • Jaja, aber Vorsicht bei Dateien mit mehr als 32767 Zeilen.


    Je nach Unix und Version von head und tail bekommst Du mehr oder weniger "lustige" Ergebnisse. Inzwischen nehme ich awk, das schert sich da nicht drum.


    uwe

    server: yavdr trusty testing, 2 * L5420, 32GB, 64TB RAID6 an OctopusNet (DVBS2- 8 ) + minisatip@dsi400 (DVBS2- 4 )
    frontends: kodi und xine

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!