string ersetzen



  • Ich habe wieder mal eine Anfängerfrage: Ich würde gerne in einem Verzeichnis mit mehreren Dateien einen String in JEDER Datei "überall" durch einen anderen ersetzen, wie bewerkstellige ich das am bequemsten? 😕

    (Ich habe bis jetzt leider weder mit dem SED noch mit Perl gearbeitet, daher habe ich damit gewisse Probleme... 😞 )



  • ich weiss nicht ob es klappt, probier mal aus

    #!/bin/bash
    
    for p in `echo *`
    do
       cat $p | sed "s/string/ersetzen_durch/;" > $p
    done
    

    [ Dieser Beitrag wurde am 18.11.2002 um 14:55 Uhr von kingruedi editiert. ]



  • Nachdem ich die einfachen Anführungszeichen (') durch Backticks (`) ersetzt hatte ging es perfekt, danke! 🙂

    Ich muss mich nach wie vor daran gewöhnen, dass man unter Linux mit BASH und Standardtools bereits sehr mächtige Helfer hat!



  • oh, da hab ich wohl shift vergessen, änder ich gleich mal das Script 🙂



  • Damit es wirklich überall geht musst du sed 's/../../g' machen -> g damit global.



  • Überhaupt ist das Script nicht so das gelbe vom Ei. Zum einen gewinnst Du den UUOCA (für alle Nicht-Shellprogrammierer: Useless Use Of Cat Award :)). Zum Zweiten könnte ich mir vorstellen, dass man im Zweifel eine leere Datei bekommt: sed (oder cat) liest aus DateiX, während die Shell was in DateiX schreiben will -> Bäh. Da geht nix über eine temp. Datei.

    Übrigens gibt's, da dieses Programm wohl schon fast unendlich oft falsch geschrieben wurde (mindestens Dateien mit Leerzeichen und Zeilenumbrüchen und sonstigen; testet das mal bei dem obigen Programm ...) ein eigenes Programm dafür: mmv. Gehört aber leider nicht in die Standard-Unix-Toolbox.



  • @DanielE.
    hast natürlich recht. Bin eben kein guter Shell Programmierer 😞

    #!/bin/bash
    
    for p in `echo *`
    do
      TMPFILE=`mktemp -q temp.XXXXXXXXXXX`
      sed "s/string/ersetzen_durch/g;" $p > $TMPFILE
      mv $TMPFILE $p
    done
    

    so besser?



  • *g*
    @all: Dass das nicht die Königslösung ist war mir schon klar, aber bei mir hat eigentlich die erste Variante zufriedenstellend funktioniert, ich werde das Skript auch in absehbarer Zeit nicht wiederverwenden, daher war das für mich schon völlig ok!
    Danke trotzdem für alle Beiträge! 🙂


Anmelden zum Antworten