\n per script durch \r\n ersetzen?

  • Hallo,


    ich wollte eigentlich mal eben ein kleines Script schreiben, was mir \n durch \r\n ersetzt. Allerdings mag sed nicht...

    Code
    sed -e 's/\n/\r\n/' summary.vdr > summary.vdr

    Sed ersetzt einfach garnichts. Habe anstelle von \r\n auch andere zeichen eingesetzt um zu schauen, ob da was passiert. Jemand ne Idee, wie man es noch machen kann?


    Exceeder

    VDR-Zapper - Achtung: Der Link hat sich geändert. Ihr findet den VDR-Zapper nun auf meiner privaten Seite. Die alte Domain ist umgezogen.

    Einmal editiert, zuletzt von VDR-Zapper ()

  • Neulich im WWW geklaut:


    sed -n -e 'H;${x;s/\n/XXX/g;p;}'


    XXX= neuer Wert, ggf. mit genügend slashes beackern (ausprobieren).

    LG
    Jochen


    Rpi4 headless mit MLD 5.4 als Server via satip-Plugin hinter einem Telestar Digibit Twin, ein Rpi3 als Streamdev-Client mit MLD 5.4

    Rpi3 auch hinter Telestar Digibit Twin und mit MLD 5.4

    Einmal editiert, zuletzt von foobar42 ()


  • Aha - wenn sed nicht macht , was ich will schau ich im man von recode - interessante These :rolleyes:


    VDR-Zapper : Ich verwende sed zu selten , aber könnte es sein , daß er die Slashes leiber als ASCII hätte , weil er sie nicht als Expression , sondern als Steuerzeichen interpretiert ?


    Wobei man sed dann helfen würde , oder auch dieser Link , vielleicht auch dieser


    HJS

  • Hi,


    also die folgenden Kommandos erfüllen alle nicht ihr ziel:

    Code
    sed -n -e 'H;${x;s/\n/\r\n/g;p;}'
    sed -n -e 'H;${x;s/\n/\\r\\n/g;p;}'
    sed -n -e 'H;${x;s/\n/\\\r\\\n/g;p;}'
    sed -e 's/\r/\r\n/g'
    sed -e 's/\x10/\x0d\x0a/g'

    Die ersten beiden ersetzen nicht durch den gewünschten Zeilenumbruch mit Wagenrücklauf und UMbruch sondern durch rn oder \r\n (als Zeichenkette). Die anderen finden den Zeilenumbruch nicht.


    Exceeder

    VDR-Zapper - Achtung: Der Link hat sich geändert. Ihr findet den VDR-Zapper nun auf meiner privaten Seite. Die alte Domain ist umgezogen.

    2 Mal editiert, zuletzt von VDR-Zapper ()

  • Zitat

    Original von Exceeder
    Die ersten beiden ersetzen nicht durch den gewünschten Zeilenumbruch mit Wagenrücklauf und UMbruch sondern durch rn oder \r\n (als Zeichenkette).


    Ooops, sorry, das hatte ich missverstanden.

    LG
    Jochen


    Rpi4 headless mit MLD 5.4 als Server via satip-Plugin hinter einem Telestar Digibit Twin, ein Rpi3 als Streamdev-Client mit MLD 5.4

    Rpi3 auch hinter Telestar Digibit Twin und mit MLD 5.4

  • Hallo,


    na dran, aber noch nicht ganz...


    sed kennt keine \n oder \r in der Ersetzung. Man muss auf printf in Verbindung mit Backticks zurückgreifen:
    sed -e "s/$/`printf '\r\n'`/" file >file.out


    Wenn man auf vollständige reguläre Ausdrücke aus ist, kann man natürlich auch auf Perl zurückgreifen. Ist zwar nicht unbedingt bei allen Distris vorhanden, aber dann ist auch ein "in place"-Bearbeiten mit automatischen Backups möglich:
    perl -p -i.bak -e "s/\n/\r\n/" file


    Hier funktioniert "s/$/\r\n/" übrigens nicht wie gewünscht, da Perl die \n am Zeilenende, im Gegensatz zu sed, nicht rausfiltert. "s/\n$/\r\n/" dagegen schon, macht aber auch nicht unbedingt Sinn. Und außerdem sind wir ja alle tippfaul ;)


    Grüße
    theVIPER

    total umgekrempelter c't VDR 2, VDR 1.3.21, Kernel 2.6.8
    Athlon 64 2800+ @ 1000, Thermalright XP120, Nexus-S, Nova-S in Mini-ATX-Gehäuse


    And remember: It's not a bug... it's a feature!

    Einmal editiert, zuletzt von theVIPER ()

  • "dos2unix", "unix2dos" wären auch eine Möglichkeit gewesen.


    Gruss ergo

    Activy 300 mit DVB-S(FF)+DVB-T(budget), Empfang nur über DVB-T, HelAus gen2vdr-Distribution.

  • Bei mir macht folgende Zeile genau das gewünschte:


    sed -e "s/$/\r/"


    Zunächst liest sed die Datei Zeilenweise, und entfernt dabei das Zeilenendezeichen, deswegen kann man nicht auf \n matchen. Statt dessen matcht $ das virtuelle Ende des Zeilenpuffers - nicht aber ein konkretes Zeichen. Die Ersetzung fügt dann ein \r vor dem Zeilenende an, und sed gibt das Ergebnis wieder aus - und hängt das vorher verschluckte \n wieder an. \r ist dabei ein von sed interpretiertes Steuerzeichen.


    theVIPER:
    Fast, aber nicht ganz!


    Deinem Ansatz kommt die Tatsache in die Quere, dass Backticks immer die letzten Zeilenumbrüche entfernen. Dein `printf '\r\n'` produziert also nur ein \r. (Das ist zum Glück auch genau das, was du hier brauchst. ;) )


    Wenn du unbedingt \r\n in die Ausgabe bekommen willst, wäre diese Variante möglich gewesen:


    sed -e `printf 's/$/\r\n/'`


    Nun meckert aber sed, da mit dem \n das s///-Kommando vorzeitig beendet wird...


    Der Umweg über printf ist aber in der Bash auch unnötig: Folgendes funktioniert auch:


    sed -e $'s/$/\r/'


    Innerhalb der $'...' Umgebung der Bash wird \r und \n schon durch die Shell ersetzt.


    Gruß,


    Udo

  • Zitat

    Original von Urig
    Bei mir macht folgende Zeile genau das gewünschte:


    sed -e "s/$/\r/"
    ...
    \r ist dabei ein von sed interpretiertes Steuerzeichen.


    Kann es sein, dass du 'ne andere Version von sed hast? Meine (GNU sed version 3.02) ignoriert den Backslash völlig und gibt nur den Buchstaben r aus.


    Zitat

    Original von Urig
    theVIPER:
    Fast, aber nicht ganz!


    Der musste jetzt sein, oder? ;D


    Zitat

    Original von Urig
    Deinem Ansatz kommt die Tatsache in die Quere, dass Backticks immer die letzten Zeilenumbrüche entfernen. Dein `printf '\r\n'` produziert also nur ein \r. (Das ist zum Glück auch genau das, was du hier brauchst. ;) )


    Das wußte ich noch nicht... tja, man lernt halt nie aus. Vielen Dank für die nachfolgenden Erläuterungen in deinem Post! :)


    Grüße
    theVIPER

    total umgekrempelter c't VDR 2, VDR 1.3.21, Kernel 2.6.8
    Athlon 64 2800+ @ 1000, Thermalright XP120, Nexus-S, Nova-S in Mini-ATX-Gehäuse


    And remember: It's not a bug... it's a feature!

    Einmal editiert, zuletzt von theVIPER ()

  • > Kann es sein, dass du 'ne andere Version von sed hast? Meine (GNU sed
    > version 3.02) ignoriert den Backslash völlig und gibt nur den Buchstaben r aus.


    Da kommen wir dem Problem wohl näher: Ich hab GNU sed 4.1.2...


    (echo Zeile1;echo Zeile2) | sed -e "s/$/\r/" | hexdump -C
    00000000 5a 65 69 6c 65 31 0d 0a 5a 65 69 6c 65 32 0d 0a |Zeile1..Zeile2..|
    00000010


    Gruß,


    Udo

  • Zitat

    Original von Urig


    > Kann es sein, dass du 'ne andere Version von sed hast? Meine (GNU sed
    > version 3.02) ignoriert den Backslash völlig und gibt nur den Buchstaben r aus.

    Da kommen wir dem Problem wohl näher: Ich hab GNU sed 4.1.2...


    Bei mir Version 3.0.2 macht das auch nicht so. :(


    Habe aber dazu auch noch eine Frage bzgl. sed:


    Wie kriege ich denn überhaupt eine neue Zeile eingefügt?
    Z.B. will ich NACH einer Zeile mit "BEISPIEL" eine neue Zeile einfügen mit "TEST".


    Ich habe es zwar bisher geschafft:


    1. Mit "G" einen neue, leere Zeile einzufügen- danach nach leeren Zeilen zu suchen bringt nix, da die Datei im Original leere Zeilen enthält, die NICHT verändert werden sollen.
    2. "TEST" hinter die alte Zeile einzufügen


    Aber eben noch nicht die Kombination aus beidem. Irgendwie fehlt mir da wohl nur noch eine Kleinigkeit.


    Mein sed.prog:

    Code
    /BEISPIEL/ {;
    G
    s/\($\)/\1TEST/g
    };


    THX
    [/EDIT]
    Vergeßt alles ab "Guten Morgen" ;)
    Jetzt funktioniert es so, wie ich das will:

    Code
    /BEISPIEL/ {;
    G
    s/$/TEST/g
    };

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

    Einmal editiert, zuletzt von knebb ()

  • Anscheinend wird \r tatsächlich erst von neueren sed-Versionen interpretiert. sed -e $'s/$/\r/' sollte aber trotzdem funktionieren.


    Zu deinem neuen Problem: Meinst du das hier?:


    Code
    /BEISPIEL/ a\
    TEST


    G ist da das falsche Kommando. g G h H x sind Kommandos, die einen Zwischenablage-ähnlichen Puffer (hold space) implementieren.


    Gruß,


    Udo

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!