dos to unix Einzeiler

Von: , Frage gestellt am Mo, 20. Nov 2006

Hallo,

mein Problem ist eher akademischer Natur. Mir würden selber viele Workarounds einfallen. Aber vielleicht weiß hier ja jemand eine Lösung wie ich sie gern hätte.

Ich möchte unter Windows, innerhalb einer Batchdatei, Dateien von Windows (CRLF) nach Unix (LF) konvertieren. Mein Ansatz ( perl -i.bak -n -e "chomp; print $_,\"\012\" " bla.txt ) funktioniert nicht, weil Perl unter Windows die LF's automatisch in CRLF's umwandelt.
Beim Googeln hab ich die Funktion binmode gefunden. Die kommt in einem Einzeiler aber nicht in Frage weil man ihr einen Dateihandler übergeben muss.
Ein zusätzliches Skript schreiben würd ich nur ungern.

Hat jemand eine geniale Idee? ;o)


Torsten

6 Antworten zu dieser Frage

  1. Antwort von nach 20 Minuten 0 hilfreich
    Re: dos to unix Einzeiler

    Hallo, Ich möchte unter Windows, innerhalb einer Batchdatei, Dateien
    von Windows (CRLF) nach Unix (LF) konvertieren. Mein Ansatz (
    perl -i.bak -n -e "chomp; print $_,\"\012\" " bla.txt )
    funktioniert nicht, weil Perl unter Windows die LF's
    automatisch in CRLF's umwandelt.
    Beim Googeln hab ich die Funktion binmode gefunden. Die kommt
    in einem Einzeiler aber nicht in Frage weil man ihr einen
    Dateihandler übergeben muss.
    perl -i.bak -e "binmode STDOUT;while(<>){print $_, qq(\012\);}"

    Ist zwar nicht mehr ganz so "Einzeiler" wie vorher, passt aber immer noch auf 80 Zeichen ;-)

    P.S. DOS-quoting sucks ;)

    Grüße,
    Moritz

    • Antwort von nach 22 Minuten 0 hilfreich
      Re^2: dos to unix Einzeiler

      :perl -i.bak -e "binmode STDOUT;while(<>){print $_,qq(\012\);}"
      

      Ich hab das übrigens nicht getestet, keine Ahnung ob -i ohne -n funktioniert, und wie <> darin arbeitet. Ich habe einfach mal auf Perls angeborene Magie vertraut, k.A. ob das gerechtfertigt war.

      Grüße,
      Moritz

      • Antwort von nach 3 Stunden 0 hilfreich
        Re^3: dos to unix Einzeiler

        Das funktioniert leider nicht. "binmode STDOUT" scheint keinen Effekt zu haben. Ein

        perl -i.bak -e "binmode STDOUT; while(<>){ chomp; print $_;}" ...

        schneidet alle Umbrüche weg. Wenn ich danach jedoch wieder ein \015 einfüge, wird es in ein CRLF umgewandelt. Egal ob ich binmode reinschreibe oder nicht. Evtl. ist binmode nur für das lesen gedacht???

        Torsten [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

        • Antwort von nach 3 Stunden 0 hilfreich
          Re^4: dos to unix Einzeiler

          Hallo Das funktioniert leider nicht. "binmode STDOUT" scheint keinen
          Effekt zu haben. Ein

          perl -i.bak -e "binmode STDOUT; while(<>){ chomp; print
          $_;}" ...

          schneidet alle Umbrüche weg. Wenn ich danach jedoch wieder ein
          \015 einfüge, wird es in ein CRLF umgewandelt. Egal ob ich
          binmode reinschreibe oder nicht. Evtl. ist binmode nur für das
          lesen gedacht???
          Nein, Du kannst das so nicht bei 'inplace edit' machen.

          versuche mal in der Batch:

           perl -0777 -pe "binmode STDOUT; y/\r//" %1 > %1.new

          d.h., Du gehst über einen _extra_ handle für stdout
          und erzeugst ein neues File (Unix mode) mit file.ext.new


          Grüße

          CMБ

          • Antwort von nach einem Tag 0 hilfreich
            Re^5: dos to unix Einzeiler

            Das hat funktioniert. Danke. Torsten

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!