depp: Shell: Ersetzen

moin
wie kann ich am effektivsten in ner 250mb größen datei alle </bestimmter_tag> ersetzen lassen durch </bestimmter_tag>\r\n ?

danke

  1. moin
    wie kann ich am effektivsten in ner 250mb größen datei alle </bestimmter_tag> ersetzen lassen durch </bestimmter_tag>\r\n ?

    Eventuell mit dem Streameditor /usr/bin/sed und dem Kommando s. In etwa so

    sed -e "s/<tag_alt>/<tag_neu>\n/g"

    Gruß
    L00NIX

    1. moin
      habs probiert. aber leider kommt das nach ner zeit:
      sed: Couldn't re-allocate memory

      1. Hallo,

        habs probiert. aber leider kommt das nach ner zeit:
        sed: Couldn't re-allocate memory

        Das ist ein malloc()-Error. Das re-allocate deutet darauf hin, dass der Input-Stream gelesen wurde, die Änderungen vorgenommen sind, aber in den Output-Stream nun nicht mehr geschrieben werden kann.
        Eine mögliche Ursache ist, dass in Deinem File eine _wirklich_ _sehr_ lange Zeile ohne \n vorkommt.

        In welcher Umgebung (Plattform, Arbeitsspeicher ...) läuft das? Um was für eine Art Datei handelt es sich?

        Tipp: Versuche mit -u ungepuffert zu arbeiten.
        http://www.die.net/doc/linux/man/man1/sed.1.html

        viele Grüße

        Axel

        1. moin
          genau das ist das problem. in der datei kommt nirgendwo ein zeilenumbruch vor. durch sed sollen an bestimmten stellen \n eingebracht werden.
          -u hat nicht geholfen. was kann ich noch versuchen?

          danke

          1. Hi,

            genau das ist das problem. in der datei kommt nirgendwo ein zeilenumbruch vor. durch sed sollen an bestimmten stellen \n eingebracht werden.
            -u hat nicht geholfen. was kann ich noch versuchen?

            Entweder ist im Aufruf von sed ein Fehler drin, oder sed ist kaputt (zwar _extrem_ unwahrscheinlich, aber nicht unmöglich). Da Du auf einem Unixsystem zu arbeiten scheinst müßte eigentlich Perl vorhanden sein.

            $ for i in  locate .htm ; do cat $i >> testdata ; done

            abgebrochen, da vergessen Gänsefüßchen um's $i zu machen,

            da ist der Loop bei der ersten Datei mit Leerzeichen

            hängengeblieben. Hupps! ;-)

            aber immer noch ein rundes halbes Gigabyte (496664200)

            time ist nur zum Zwecke der Messung (ist hier ein 1200er

            Duron mit 512 MiB RAM)

            $ time perl -pie 's/<table>/\n/g' testdata

            real    3m36.767s
            user    0m18.470s
            sys     0m10.460s

            Flott ist Perl ja, kann man sagen, was man möchte und

            dazu rappelt bei mir Sonntags um 01:00 noch einiges an

            Cronjobs los! ;-)

            Ein kleiner Test zum Abschluß:

            $ grep '<table>' testdata | wc -l
                  0

            Der Perlbefehl ist auch leicht zu merken, da die Optionen zu einem "pie", einem "Törtchen" also, geordnet werden können.
            Siehe auch 'man perlrun'.

            so short

            Christoph Zurnieden

            PS:
            Finde die Fehlermeldung von sed aber wirklich _sehr_ merkwürdig. Bist Du Dir sicher, das Du Dich nirgendwo vertippt hast?
            CZ