Mirko: (VI) : scriptfile auf alle geladenen Files anwenden - wie?

Halli hallo,

ich suche nach einer Möglichkeit, eine vi-Skriptdatei auf alle geladenen Files anzuwenden, da ich in einer großen Zahl von Dokumenten etwas replacen will.

Mit

vi *.html -s skripdatei

wird die Skriptdatei nur einmal abgearbeitet, und wenn sie zu Ende ist, bleiben die übrigen Files unberührt. Ich habe daher bisher den uneleganten Weg gewählt, die Skriptdatei folgendermaßen zu gestalen:

:g/SUCHSTRING/s//ERSATZSTRING/g
:w
:next

Dann habe die obigen 3 Zeilen einfach sehr oft nacheinander in die Skriptdatei kopiert.

Mit dieser Methode müsste man aber für sehr viele Files den obigen Block sehr oft in der Skriptdatei wiederholen, was diese sehr groß macht, und darüber hinaus weiß ich vorher auch gar nicht, wieviele Files es genau sind (und müsste dann das Skript ggf. jedesmal erweitern).

Gibt es vielleicht eine flexiblere Lösung, mit der ich ein Skript auf alle geöffneten Files anwenden kann? Vielleicht mit einem (bedingten) Historykommando (?) oder einen Kommandozeilenparameter, den ich bisher noch nicht entdeckt habe?

Vielen Dank im Voraus,

Mirko

  1. Moin!

    ich suche nach einer Möglichkeit, eine vi-Skriptdatei auf alle geladenen Files anzuwenden, da ich in einer großen Zahl von Dokumenten etwas replacen will.

    Nimm "sed". Der ist für sowas geeigneter. IMVHO natürlich nur. :)

    - Sven Rautenberg

    1. Hallo,

      Nimm "sed". Der ist für sowas geeigneter. IMVHO natürlich nur. :)

      Aha. Wie ich mit sed etwas replacen kann, habe ich nun rausgefunden. Nur lässt sich das hier irgendwie auch nicht so einfach auf mehrere Files anwenden, da man den Output, den sed produziert, ja auch noch extra "per Hand" umleiten muss.

      sed s/SUCHSTRING/ERSATZSTRING/g *.html >*.html

      geht nämlich verständlicherweise leider nicht...

      Any idea?

      Bye-

      Mirko

      1. Moin!

        Nimm "sed". Der ist für sowas geeigneter. IMVHO natürlich nur. :)

        Aha. Wie ich mit sed etwas replacen kann, habe ich nun rausgefunden. Nur lässt sich das hier irgendwie auch nicht so einfach auf mehrere Files anwenden, da man den Output, den sed produziert, ja auch noch extra "per Hand" umleiten muss.

        sed s/SUCHSTRING/ERSATZSTRING/g *.html >*.html

        geht nämlich verständlicherweise leider nicht...

        Du solltest dich nochmal über Funktionsweise des Befehls "for" innerhalb der Shell informieren. Es ist ohne Probleme möglich, einen definierten Befehl für alle Dateien eines Verzeichnisses durchzuführen.

        Und noch ein heißer Tipp: Bevor da irgendwas schiefgeht: Leite die Ausgabe des Befehls lieber in ein neues Verzeichnis um und lasse so geänderte Duplikate aller Dateien erstellen - du verlierst sonst auf einen Schlag alle Dateien. Abgesehen davon glaube ich kaum, daß man aus einer Datei lesen und sie gleichzeitig neu schreiben kann.

        - Sven Rautenberg

  2. Hi Mirko,

    also ich hab vor einiger Zeit mal mit Ulli Meybohms rxr Skript ganz gute Erfahrungen gemacht. Der Link ist http://www.meybohm.de/gnu.html. Am besten, Du stellst Dir eine Liste mit den Dateien zusammen und machst Dann sowas:

    cat dateiliste.txt | ./rxr SUCHSTRING ERSETZUNG

    vorausgesetzt, Du hast eine Linux/Unix-Maschine.

    viele Grüsse
    Achim Schrepfer