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

Thema: Text ersetzen in mehreren Dateien und Ordnern, sed

  1. #1
    Registrierter Benutzer
    Registriert seit
    Jun 2002
    Ort
    22589 Hamburg
    Beiträge
    951

    Text ersetzen in mehreren Dateien und Ordnern, sed

    Ich habe einen Ordner, indem einige Dateien und auch Unterordner vorhanden sind, indem auch wieder Dateien sind. Nun muss ich in all diesen Dateien ein bestimmtes Wort (z.B. subSilver) durch ein anderes (z.B. knall) ersetzen. Dieses Wort kann mehrmals oder auch nur einmal in jeder Datei vorkommen oder auch in einigen Dateien nicht vorhanden sein. Ich möchte, wenn möglich, nicht jede Datei einzeln bearbeiten, sondern alle auf einen Schlag. Die Suche hier im Forum, brachte mich zu dem Befehl sed. Da ich kaum Englisch kann, bin ich hauptsächlich auf deutsche Docus angewiesen. Nach dem lesen von http://www.linuxfibel.de/sed.htm hänge ich nun leider fest.
    Meine Idee war um subSilver in knall zu ersetzen folgendes, hatte aber nicht den gewünschten Erfolg:
    sed -n 's#subSilver#knall#gp' *
    oder auch
    sed -n 's/subSilver/knall/gp' *

    Wie bekomme ich es hin, alle in dem Ordner und dessen Unterordnern enthaltenen Dateien so zu bearbeiten, das subSilver durch knall ersetzt wird?
    P4 3,4 Northwood, P4C800-E D., 2GB Ram, Seagate ST3200822AS (Debian Lenny), Plextor PX-716A, Leadtek 6800 ultra, Soundblaster Live

  2. #2
    refused are ****ing dead Avatar von Freekazonid
    Registriert seit
    Jul 2002
    Beiträge
    2.585
    find . -type f -name pe -exec sed -i -e 's/^.*WORD1.*$/WORD2/' {} \;


    pe ist der name der dateien wo das ersetzen stattfindet, WORD1 ist das urspruengliche wort, WORD2 das was an seiner stelle hinkommt. der rest alles immer so alles

  3. #3
    Registrierter Benutzer
    Registriert seit
    Jun 2002
    Ort
    22589 Hamburg
    Beiträge
    951
    haut leider nicht hin
    Mein erster Versuch war
    find . -type f -name * -exec sed -i -e 's/^.*subSilver.*$/knall/' {} \;
    Da er den Platzhalter leider nicht aktzeptierte, versuchte ich es mit einer einzelnen Datei, wobei ich ja eigentlich den ganzen Ordner und die Unterordner in einem Schlag bearbeiten wollte.
    find . -type f -name theme_info.cfg -exec sed -i -e 's/^.*subSilver.*$/knall/' {} \;
    Daraufhin änderte er die Datei wie folgt:
    Aus
    Code:
    <?php
    //
    // phpBB 2.x auto-generated theme config file for subSilver
    // Do not change anything in this file!
    //
    $subSilver[0]['template_name'] = "subSilver";
    $subSilver[0]['style_name'] = "subSilver";
    $subSilver[0]['head_stylesheet'] = "subSilver.css";
    $subSilver[0]['body_background'] = "";
    .....
    ?>
    wurde

    Code:
    <?php
    //
    knall
    // Do not change anything in this file!
    //
    knall
    knall
    knall
    knall
    .....
    ?>
    P4 3,4 Northwood, P4C800-E D., 2GB Ram, Seagate ST3200822AS (Debian Lenny), Plextor PX-716A, Leadtek 6800 ultra, Soundblaster Live

  4. #4
    @Debian Avatar von tictactux
    Registriert seit
    Oct 2004
    Beiträge
    2.872
    Zitat Zitat von knallzapzerap
    haut leider nicht hin
    Mein erster Versuch war
    find . -type f -name * -exec sed -i -e 's/^.*subSilver.*$/knall/' {} \;
    Da er den Platzhalter leider nicht aktzeptierte, versuchte ich es mit einer einzelnen Datei, wobei ich ja eigentlich den ganzen Ordner und die Unterordner in einem Schlag bearbeiten wollte.
    find . -type f -name theme_info.cfg -exec sed -i -e 's/^.*subSilver.*$/knall/' {} \;
    1. denke über Shell-Expansion nach. "-name *" kann nicht hinhaun, da das
    * von der Shell expandiert wird, und find stolpert darüber mit Syntaxfehlern.
    Abilfe: -name '*' (oder "*").

    2. reguläre Ausdrücke sind keine Shell-Muster.
    "^.*subSilver" findet das gleiche wie "^.*sonstWas" (ein als greediness bzw.
    "Gierigkeit" bezeichnetes Verhalten).
    Das Verankern mit ^ und $ macht für mich in diesem Ausdruck keinen Sinn,
    da Du ja wortweise arbeiten willst (?)
    Begrenzer für Wortgrenzen sind \< und \>.
    also z.B. sed -e 's/\<subSilver\>/knall/g'

    3. es kann übersichtlicher sein, den sed-Aufruf in eine Schleife zu packen:
    Code:
    #!/bin/bash
    DATMASKE='*.php'
    for x in $(find . -type f -iname "$DATMASKE"); do
        sed -i -e 's/\<subSilver\>/knall/g' $x
    done
    HTH
    Wolfgang

  5. #5
    Registrierter Benutzer
    Registriert seit
    Jun 2002
    Ort
    22589 Hamburg
    Beiträge
    951
    Zitat Zitat von tictactux
    Das Verankern mit ^ und $ macht für mich in diesem Ausdruck keinen Sinn,
    da Du ja wortweise arbeiten willst (?)
    Ich möchte das jedes subSilver, was in den ganzen Dateien vorkommt in knall umbenannt wird, ansonsten aber keinerlei Änderungen stattfinden. Das ganze handelt sich um verschiedene Styles, die je nach Ihrem Stylename, in allen Dateien abgeglichen werden müssen. Der Weg über ein script ist natürlich wesentlich kompfortabler, da ich dann nur jedesmal wenn ein neuer Style erstellt wird, den neuen Stylenamen im Script abändern brauche.

    Zitat Zitat von tictactux
    3. es kann übersichtlicher sein, den sed-Aufruf in eine Schleife zu packen:
    Code:
    #!/bin/bash
    DATMASKE='*.php'
    for x in $(find . -type f -iname "$DATMASKE"); do
        sed -i -e 's/\<subSilver\>/knall/g' $x
    done

    bevor ich nun das ganze nocheinmal ausprobiere 2 Verständnissfragen.
    DATMASKE='*.php' würde alle Dateien mit der Endung .php im aktuellen Ordner bearbeiten?
    Da ich 2 Dateitypen habe (tpl und cfg) müsste ich mir 2 Scripte schreiben, wo einmal '*.tpl' und einmal '*.cfg' als DATMASKE=stehen würden und diese in allen Ordnern jeweils einmal ausführen?


    EDIT
    habe jetzt mal mit oben genanntem Code mit der Änderung
    DATMASKE='*.cfg'
    versucht die Dateien zu ändern und erhalte folgende Fehlermeldung
    zap@knall:~/phpbb/phpbb/templates/knall> ./subSilver-knall-cfg.sh
    : bad interpreter: Datei oder Verzeichnis nicht gefunden
    Geändert von knallzapzerap (18.12.04 um 23:53 Uhr)
    P4 3,4 Northwood, P4C800-E D., 2GB Ram, Seagate ST3200822AS (Debian Lenny), Plextor PX-716A, Leadtek 6800 ultra, Soundblaster Live

  6. #6
    @Debian Avatar von tictactux
    Registriert seit
    Oct 2004
    Beiträge
    2.872
    Zitat Zitat von knallzapzerap
    Ich möchte das jedes subSilver, was in den ganzen Dateien vorkommt in knall umbenannt wird, ansonsten aber keinerlei Änderungen stattfinden.
    Tut das genannte Beispiel auch. sed arbeitet die Datei Zeile für Zeile durch (->man sed).
    Das Flag /g weist sed zusätzlich an, auch mehrere Vorkommen innerhalb
    einer Zeile
    zu ersetzen.
    DATMASKE='*.php' würde alle Dateien mit der Endung .php im aktuellen Ordner bearbeiten?
    Die Maske ist ein Beispiel. Es würden alle Dateien im und unterhalb des aktuellen
    Ordners bearbeitet. Das ist der Sinn des Einsatzes von find(1).
    Da ich 2 Dateitypen habe (tpl und cfg) müsste ich mir 2 Scripte schreiben, wo einmal '*.tpl' und einmal '*.cfg' als DATMASKE=stehen würden und diese in allen Ordnern jeweils einmal ausführen?
    Nein, find hat eine "oder" Option (-o). Der Aufruf könnte aussehen:
    $(find . -type f -iname "*.tpl" -o -iname "*.cfg")

    Gruss,
    Wolfgang

  7. #7
    @Debian Avatar von tictactux
    Registriert seit
    Oct 2004
    Beiträge
    2.872
    Zu Deinem "bad Interpreter": Prüfe die erste Zeile in dem Skript.
    Der Name der Shell hinter #! ist falsch geschrieben oder das Verzeichnis
    stimmt nicht.

    btw: Zum Testen solltest Du natürlich nicht auf Original-Dateien arbeiten.
    Hilfreich ist vielleicht, die Option -i von sed abzuändern in --in-place=bak
    oder "-ibak", wodurch Backups von den bearbeiteten Originaldateien erstellt
    werden (mit der oben angegebenen Erweiterung)
    Geändert von tictactux (19.12.04 um 00:00 Uhr)

  8. #8
    Registrierter Benutzer
    Registriert seit
    Jun 2002
    Ort
    22589 Hamburg
    Beiträge
    951
    ich habe das Script jetzt so geschrieben und ausführbar gemacht.
    Code:
    #!/bin/bash
    for x in $(find . -type f -iname "*.tpl" -o -iname "*.cfg"); do
        sed -i -e 's/\<subSilver\>/knall/g' $x
    done
    Leider habe ich immer noch den bad interpreter Fehler.
    #!/bin/bash habe ich auch in anderen Scripten die diese Fehlermeldung nicht haben.

    Edit
    eine Sicherungskopie der Dateien habe ich selbstverständlich vorher erstellt
    P4 3,4 Northwood, P4C800-E D., 2GB Ram, Seagate ST3200822AS (Debian Lenny), Plextor PX-716A, Leadtek 6800 ultra, Soundblaster Live

  9. #9
    @Debian Avatar von tictactux
    Registriert seit
    Oct 2004
    Beiträge
    2.872
    Zitat Zitat von knallzapzerap
    ich habe das Script jetzt so geschrieben und ausführbar gemacht.
    Wenn Du da absolut sicher bist, und überprüft ob /bin/bash existiert
    (sollte auf Linux ohnehin sein ), prüfe, ob Du das Skript von einer
    Partition startest (z.B. FAT32) die kein exec-Attribut hat (bzw. mit user(s)
    oder noexec gemountet ist).
    In dem Fall, kopiere das Skript am besten nach /usr/local/bin.

  10. #10
    Registrierter Benutzer
    Registriert seit
    Jun 2002
    Ort
    22589 Hamburg
    Beiträge
    951
    es ist wie verhext
    /bin/bash ist trotz SuSE vorhanden

    /dev/hda7 /home reiserfs defaults 1 2
    /dev/hda8 /usr reiserfs defaults 1 2

    chmod 777 habe ich ausgeführt, die Daten habe ich herauskopiert aus dem Script und daher schliesse ich einen Flüchtigkeitsrechtschreibfehler aus.
    Es funktioniert nicht wenn das script im Datenverzeichnis ist und auch nicht im /usr/local/bin Immer wieder der bad interpreter. Als das Script im /usr/local/bin war habe ich natürlich den ./ weggelassen und vorher das Script im Datenverzeichnis gelöscht
    Geändert von knallzapzerap (19.12.04 um 00:30 Uhr)
    P4 3,4 Northwood, P4C800-E D., 2GB Ram, Seagate ST3200822AS (Debian Lenny), Plextor PX-716A, Leadtek 6800 ultra, Soundblaster Live

  11. #11
    @Debian Avatar von tictactux
    Registriert seit
    Oct 2004
    Beiträge
    2.872
    Zitat Zitat von knallzapzerap
    /bin/bash ist trotz SuSE vorhanden
    Daher der Begriff "SuSE-bashing"

    Kopier doch mal ein Skript, welches sonst funktioniert in das Verzeichnis,
    in dem Du Dich befindest. Hat das Verzeichnis vielleicht keine Ausführrechte ?
    (obwohl die Fehlermeldung dann anders lauten sollte...)

  12. #12
    Registrierter Benutzer
    Registriert seit
    Jun 2002
    Ort
    22589 Hamburg
    Beiträge
    951
    Ein anderes Script in dem Ordner funktioniert problemlos.
    Das Verzeichniss hat 755
    P4 3,4 Northwood, P4C800-E D., 2GB Ram, Seagate ST3200822AS (Debian Lenny), Plextor PX-716A, Leadtek 6800 ultra, Soundblaster Live

  13. #13
    @Debian Avatar von tictactux
    Registriert seit
    Oct 2004
    Beiträge
    2.872
    Sorry, dann muß es an der ersten Zeile liegen, mehr fällt mir dazu nicht ein.
    Achte darauf, daß es wirklich die erste Zeile ist (keine Leerzeilen davor).
    Teste es ansonsten mit: sh DeinScript

  14. #14
    Registrierter Benutzer
    Registriert seit
    Jun 2002
    Ort
    22589 Hamburg
    Beiträge
    951
    ich hab den Fehler gefunden
    Es lag an kwrite, der bei mir gerade als Editor ausgedient hat. Ich habe die Datei mit mcedit aufgerufen und sah dort in kwrite unsichtbare ^M nach jedem Zeilenende, die wohl durch kwrite dort aus mir unerfindlichen Gründen eingefügt wurden. Als ich diese entfernt habe funktionierte das Script

    Vielen Dank für die Hilfe, mit diesem Script ist mir in nächster Zeit einiges an Arbeit abgenommen allerdings muss ich mir jetzt einen anderen Editor suchen, aber da ist die Auswahl ja doch etwas grösser
    P4 3,4 Northwood, P4C800-E D., 2GB Ram, Seagate ST3200822AS (Debian Lenny), Plextor PX-716A, Leadtek 6800 ultra, Soundblaster Live

  15. #15
    @Debian Avatar von tictactux
    Registriert seit
    Oct 2004
    Beiträge
    2.872
    Zitat Zitat von knallzapzerap
    Es lag an kwrite, der bei mir gerade als Editor ausgedient hat. Ich habe die Datei mit mcedit aufgerufen und sah dort in kwrite unsichtbare ^M nach jedem Zeilenende, die wohl durch kwrite dort aus mir unerfindlichen Gründen eingefügt wurden. Als ich diese entfernt habe funktionierte das Script
    Ich gratuliere mir dazu, darauf nicht spontan geantwortet zu haben
    allerdings muss ich mir jetzt einen anderen Editor suchen
    Keinen anderen, nur einen Editor.
    Viel Spaß dabei,
    Wolfgang

Ähnliche Themen

  1. nach schlüsselwörtern in text dateien suchen lassen ?
    Von depp im Forum Anwendungen Allgemein, Software
    Antworten: 5
    Letzter Beitrag: 13.01.04, 20:17
  2. Emaxs: Casesensitive Suche, Suche in mehreren Dateien?
    Von nobody0 im Forum Anwendungen Allgemein, Software
    Antworten: 0
    Letzter Beitrag: 07.12.03, 11:17
  3. Anzeigen der letzten 5 Zeilen aus mehreren Dateien
    Von svern im Forum Linux Allgemein
    Antworten: 11
    Letzter Beitrag: 09.05.03, 12:43
  4. suchen in mehreren dateien in unterverzeichnissen
    Von patoberli im Forum Linux Allgemein
    Antworten: 4
    Letzter Beitrag: 18.12.02, 07:39
  5. sed bricht bei String "*" ab
    Von Nighthawk im Forum System installieren und konfigurieren
    Antworten: 0
    Letzter Beitrag: 25.03.02, 11:12

Lesezeichen

Berechtigungen

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