Wie füge ich einen Wagenrücklauf vor jeder neuen Zeile hinzu?


28

Ich habe eine Datei, die nur \nfür neue Zeilen verwendet wird, aber ich muss sie \r\nfür jede neue Zeile haben. Wie kann ich das machen?

Zum Beispiel habe ich es in Vim mit gelöst :%s/\n/\r\n/g, aber ich möchte ein Skript oder eine Befehlszeilenanwendung verwenden. Irgendwelche Vorschläge?

Ich habe versucht, dies mit sedoder grepnachzuschlagen, aber ich war sofort verwirrt über die Umgehungen der Escape-Sequenz (ich bin ein bisschen grün mit diesen Befehlen).

Bei Interesse bezieht sich die Bewerbung auf meine Frage / Antwort hier

Antworten:


36

Sie können unix2dos (das unter Debian gefunden wurde) verwenden:

unix2dos file

Beachten Sie, dass diese Implementierung wird kein Einsatz CRvor jedem LF, nur vor jenen LFs , die nicht bereits von einem vorausgeht (und nur eine) CRund binäre Dateien überspringen (jene , die Byte - Werte in der 0x0 enthalten -> 0x1f anderen Bereich als LF, FF, TABoder CR).

oder benutze sed:

CR=$(printf '\r')
sed "s/\$/$CR/" file

oder benutze awk:

awk '{printf "%s\r\n", $0}' file

oder benutze perl:

perl -pe 's|\n|\r\n|' file

Beachten Sie, dass in unix2dox nicht CRvor jedem LF ein eingefügt wird, sondern nur vor den LFs, denen noch kein (und nur ein) CR vorangestellt ist.
Stéphane Chazelas

@ StéphaneChazelas: Danke für den Punkt, fügte es meiner Antwort hinzu.
Cuonglm

1
Die wichtigste Information für mich war, dass die Verwendung von '\r'with sedden Trick macht.
Rkersh

8

Genau das unix2dosmacht:

$ unix2dos file.txt

Dadurch wird die vorhandene file.txtVersion durch eine Version mit CRLF-Zeilenenden ersetzt.

Wenn Sie dies tun möchten sed, können Sie am Ende jeder Zeile einen Zeilenumbruch einfügen:

sed -e 's/$/\r/' file.txt

Dies ersetzt ( s) den Bereich mit der Größe Null direkt vor dem Ende der Zeile ( $) mit \r. Vor-Ort-Austausch durchführen (zunix2dos der Fall ist), verwenden sed -i.bak, obwohl , dass eine Nicht-Standard - Erweiterung ist - wenn Sie es nicht haben, verwenden Sie eine temporäre Datei.


3
Die Verwendung \rals Ersatz ist nicht tragbar. Zumindest funktioniert es unter Mac OSX nicht.
1.

Beachten Sie, dass es verschiedene Implementierungen von unix2dos gibt. Möglicherweise möchten Sie einen Link zur Homepage einer bestimmten Implementierung (wie waterlan.home.xs4all.nl/dos2unix.html in Debian) anstelle von linux.die.net/man angeben, wodurch nicht klar wird, welche Implementierung (oder Version) ist dokumentiert. Beachten Sie, dass es einige u2d, ux2dos, todosBefehle um auch.
Stéphane Chazelas

2

Wenn Sie die Konvertierung auf einem Unix-Rechner (OS X, Linux) durchführen, öffnen Sie die Datei mit vi oder vim:

$ vim my-file

Drücken Sie die ESC-Taste, um sicherzustellen, dass Sie sich nicht im Einfügemodus befinden, und geben Sie dann Folgendes ein

:set ff=dos

oder

:set fileformat=dos

Die Konvertierung erfolgt durch Festlegen des Dateiformats.

Um die Datei zu schreiben und den Editor zu verlassen, verwenden Sie

:wq

Auf der Kommandozeile können Sie tun

$ vi +':w ++ff=dos' +':q' my-file

Vielen Dank, dass Sie alle Schritte erklärt haben - für einen Neuling ist es viel einfacher zu verstehen, was los ist.
user3616725

2

Dies mit POSIX zu tun, ist schwierig:

  • POSIX Sed unterstützt \roder nicht \15. Selbst wenn dies der Fall -iist , ist die In-Place-Option nicht POSIX

  • POSIX Awk tut Unterstützung \rund \15, aber die -i inplaceOption nicht POSIX ist

  • d2u und dos2unix sind keine POSIX-Dienstprogramme , aber ex ist

  • POSIX ex nicht unterstützt \r, \15, \noder\12

So entfernen Sie Wagenrückläufe:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\r","");print>ARGV[1]}' file

So fügen Sie Wagenrückläufe hinzu:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file

1

Eine portable Shell-Funktion, die dies erledigt:

u2dos() (set -f; IFS='
'; printf '%s\r\n' $(cat "$1"))

Damit können Sie:

u2dos file >dosfile

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.