Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 20

Thema: Hilfe bei Bash-Script gesucht, um Zeile in Textdatei zu kopieren & dabei zu ändern

  1. #1
    Sidux User
    Registriert seit
    Oct 2004
    Beiträge
    197

    Question Hilfe bei Bash-Script gesucht, um Zeile in Textdatei zu kopieren & dabei zu ändern

    Hallo zusammen,

    ich möchte folgendes tun:

    In allen .txt-Dateien in einem Verzeichnis (inkl. Unterverzeichnissen) soll auf eine darin enthaltene Zeile gesucht werden, die mit #ABC: beginnt.

    Diese soll dann als neue Zeile unter die originale Zeile kopiert werden, wobei bei der Kopie #ABC: ersetzt werden soll durch #XYZ:.

    Beispiel:
    Code:
    ---Originale Datei---
    zeile mit irgendwas
    zeile mit irgendwas
    #ABC:2008
    zeile mit irgendwas
    
    ---Veränderte Datei---
    zeile mit irgendwas
    zeile mit irgendwas
    #ABC:2008
    #XYZ:2008
    zeile mit irgendwas
    Anschließend möchte ich in den Textdateien alles was in der jeweiligen #ABC:-Zeile hinter #ABC: kommt durch 2009 ersetzen.

    Beispiel:
    Code:
    ---Originale Datei---
    zeile mit irgendwas
    zeile mit irgendwas
    #ABC:2008
    #XYZ:2008
    zeile mit irgendwas
    
    ---Veränderte Datei---
    zeile mit irgendwas
    zeile mit irgendwas
    #ABC:2009
    #XYZ:2008
    zeile mit irgendwas
    Über Hinweise zur Entwicklung eines Scriptes wäre ich sehr dankbar!!!

  2. #2
    Registrierter Benutzer
    Registriert seit
    Sep 2003
    Beiträge
    2.990
    Zitat Zitat von CyrusQ Beitrag anzeigen
    Über Hinweise zur Entwicklung eines Scriptes wäre ich sehr dankbar!!!
    folgende tolls waeren evt. sinnvoll

    Code:
    awk
    find
    ....

  3. #3
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    21.464
    Code:
    sed
    nicht vergessen...
    Ich bin root - ich darf das.

  4. #4
    Sidux User
    Registriert seit
    Oct 2004
    Beiträge
    197
    Mein Problem ist, dass ich stundenlang gesucht und probiert habe, aber leider nur total fehlerhafte Scripts hatte. sed ist ja für Einsteiger auch nicht gerade einfach...

    Welche Schritte sind denn nach der sed-Programmierlogik notwendig?

    1. Suche in der txt nach Zeile mit Begin #ABC:
    2. ???

  5. #5
    Shell-User Avatar von zyrusthc
    Registriert seit
    Jan 2004
    Ort
    http://www.thale.de
    Beiträge
    6.331
    Vielleicht:
    sed 's/#ABC:/#ABC:#XYZ:/g' datei > datei.neu

    Vielleicht kann jetzt jemand noch den Tip geben wie man den Umbruch zwischen #ABC: und #XYZ: bekommt.


    EDIT : http://sed.sourceforge.net/sed1line_de.html

    Greeez Oli
    Geändert von zyrusthc (28.08.09 um 13:58 Uhr)
    Notebook: Lenovo Z570 CoreI7
    Workstation: Core2Quad Q6700 - ASUS P5WDG2-WS Pro - 8800GT - 4GB-DDR2/800 - 4x500GB=RAID1 - 120GB SSD - Innovatek Wakü - 27Widescreen/AcerTFT
    Server: IBM X345 + Netfinity 5000

    http://zyrusthc-linux.no-ip.org

  6. #6
    Sidux User
    Registriert seit
    Oct 2004
    Beiträge
    197
    Danke, zyrusthc - aber dies hatte ich bereits getestet. Es wird leider nur #ABC: durch #ABC:#XYZ: ersetzt - dagegen möchte ich aber die gesamte Zeile kopieren und gleichzeitig ersetzen. Geht das überhaupt?

  7. #7
    Besen-Wesen Avatar von Ginsengelf
    Registriert seit
    Feb 2003
    Ort
    Mars
    Beiträge
    564
    Moin, vielleicht tut's
    Code:
    sed 's/#ABC:\([A-Za-z0-9]*\)/#ABC:2009\n#XYZ:\1/g' datei > datei.neu
    ?

    Ginsengelf

    PS: Funktion: sucht #ABC:, speichert alles dahinter in \1, erzeugt Zeile #ABC:2009, Umbruch, neue Zeile #XYZ: und dann alles was in der ersten Zeile stand
    Geändert von Ginsengelf (28.08.09 um 15:28 Uhr) Grund: Zeilenumbruch vergessen
    God's in his heaven. All's right with the world.
    System: Phenom II X6 auf Asus M5A97 Pro, AMD Vega, 8 GB DDR3-RAM, openSUSE Tumbleweed

  8. #8
    Sidux User
    Registriert seit
    Oct 2004
    Beiträge
    197
    Genial!!! Das ist genau das, was ich gesucht habe

    Damit ich ein besseres Verständnis für dieses sed bekomme, könntest Du bei Gelegenheit die Syntax noch etwas detaillierter erklären? Dann kann ich selbst auch sed weiter vertiefen...

    Ergänzung zum Script: Wie bekomme ich es hin, dass der Befehl für alle *.txt-Dateien in einem Ordner samt Unterordner angewendet wird?

  9. #9
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    21.464
    z.B. mit find
    Ich bin root - ich darf das.

  10. #10
    Besen-Wesen Avatar von Ginsengelf
    Registriert seit
    Feb 2003
    Ort
    Mars
    Beiträge
    564
    Zitat Zitat von CyrusQ Beitrag anzeigen
    Damit ich ein besseres Verständnis für dieses sed bekomme, könntest Du bei Gelegenheit die Syntax noch etwas detaillierter erklären? Dann kann ich selbst auch sed weiter vertiefen...
    http://de.linwiki.org/wiki/Linuxfibel_-_Unix-Werkzeuge

    Das Kapitel über Reguläre Ausdrücke ist sehr hilfreich. Die Dinger helfen überall, weil diverse Programme von sed über awk bis grep damit benutzt werden können.

    Ginsengelf
    God's in his heaven. All's right with the world.
    System: Phenom II X6 auf Asus M5A97 Pro, AMD Vega, 8 GB DDR3-RAM, openSUSE Tumbleweed

  11. #11
    Sidux User
    Registriert seit
    Oct 2004
    Beiträge
    197
    ok.

    Code:
    find . -iname "*.txt"
    findet schonmal die Dateien

    Code:
    find . -iname "*.txt" -exec cp {} {}.bkp \;
    erstellt mir Sicherungskopien der Dateien


    Code:
    find . -iname "*.txt" -exec sed 's/#ABC:\([A-Za-z0-9]*\)/#ABC:2009\n#XYZ:\1/g' {} \;
    funktioniert aber leider nicht, ich sehe in der Bash-Ausgabe nur massig Inhalte der txt-Dateien

    Wo liegt der Fehler im letzten Befehl? Kann es sein, dass find und sed sich um die Zwischenablage streiten?
    Geändert von CyrusQ (28.08.09 um 17:18 Uhr) Grund: korrigiert

  12. #12
    Registrierter Benutzer
    Registriert seit
    Jan 2008
    Beiträge
    2.496
    http://en.wikipedia.org/wiki/Sed

    in-place:

    Code:
    find . -iname "*.txt" -exec sed -i 's/#ABC:\([A-Za-z0-9]*\)/#ABC:2009\n#XYZ:\1/g' {} \;

  13. #13
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    21.464
    ... und wenn man die man-Page von sed aufmerksam ließt - so findet man auch eine Option, die einem die Backups automatisch erstellt.
    Ich bin root - ich darf das.

  14. #14
    Sidux User
    Registriert seit
    Oct 2004
    Beiträge
    197
    Super, danke vielmals!

    Nun möchte ich das Script noch so ergänzen, dass es - falls die Zeile mit Beginn #ABC: nicht existiert - unter einer Zeile mit Beginn #ARTIST: eine neue Zeile mit dem Inhalt #ABC:2009 einfügt.

    Wie sollte ich den Befehl ergänzen, um das umzusetzen? Oder benötige ich zwei getrennte Befehle?

    Beste Grüße
    CyrusQ

  15. #15
    Registrierter Benutzer Avatar von buzz768
    Registriert seit
    Apr 2005
    Ort
    Rostock
    Beiträge
    2.016
    Code:
    sed -i 's/#ABC:\([A-Za-z0-9]*\)/#ABC:2009\n#XYZ:\1/g;t;/#ARTIST:/a#ABC:2009'
    Arch Linux / Intel Z77 / i5-3570K / 8GB PC3-1333 / SAMSUNG SSD 830 128GB

Ähnliche Themen

  1. Wichtig!!!! Ich brauche Hilfe!!!
    Von HEMIcuda im Forum Meldungen und Mitglieder
    Antworten: 1093
    Letzter Beitrag: 16.03.16, 08:32
  2. Java installation fehlgeschlagen!
    Von MegaBlue im Forum Anwendungen Allgemein, Software
    Antworten: 0
    Letzter Beitrag: 17.07.09, 17:16
  3. Bash Befehl in Perl Script starten
    Von Dom im Forum Linux Allgemein
    Antworten: 6
    Letzter Beitrag: 09.02.06, 07:49
  4. verbindung bricht alle 20minuten ab :-(
    Von luckystrikerulz im Forum Anbindung an die Aussenwelt
    Antworten: 4
    Letzter Beitrag: 26.11.05, 12:29
  5. iptables script HILFE
    Von DaGrrr im Forum Sicherheit
    Antworten: 8
    Letzter Beitrag: 03.09.02, 10:54

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •