it-swarm.com.de

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

Ich habe eine Datei, die nur \n Für neue Zeilen verwendet, aber ich brauche sie, um \r\n Für jede neue Zeile zu haben. Wie kann ich das machen?

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

Ich habe versucht, dies mit sed oder grep nachzuschlagen, aber ich wurde sofort durch die Problemumgehungen der Escape-Sequenz verwirrt (ich bin mit diesen Befehlen ein bisschen grün).

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

28
modulitos

Sie können nix2dos (das auf Debian gefunden wurde) verwenden:

unix2dos file

Beachten Sie, dass diese Implementierung nicht vor jedem CR ein LF einfügt, sondern nur vor den LF, denen nicht bereits ein (und nur ein) CR und überspringt Binärdateien (solche, die andere Bytewerte im Bereich 0x0 -> 0x1f als LF, FF, TAB oder CR enthalten). .

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
38
cuonglm

Genau das macht unix2dos :

$ unix2dos file.txt

Dadurch wird file.txt An Ort und Stelle durch eine Version mit CRLF-Zeilenenden ersetzt.

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

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

Dies ersetzt ( s ) den Bereich mit der Größe Null unmittelbar vor dem Zeilenende ( $ ) durch \r. Verwenden Sie zum direkten Ersetzen (wie bei unix2dos) sed -i.bak, Obwohl dies eine nicht standardmäßige Erweiterung ist. Wenn Sie diese nicht haben, verwenden Sie eine temporäre Datei.

9
Michael Homer

Dies mit POSIX zu tun ist schwierig:

  • POSIX Sed unterstützt nicht \r Oder \15. Selbst wenn dies der Fall ist, ist die vorhandene Option -i Nicht POSIX

  • POSIX Awk unterstützt \r Und \15, Die Option -i inplace Ist jedoch nicht POSIX

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

  • POSIX ex unterstützt nicht \r, \15, \n Oder \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
2
Steven Penny

Wenn Sie die Konvertierung auf einem Unix-Computer (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 ein

:set ff=dos

oder

:set fileformat=dos

Dies erfolgt durch Konvertieren durch Festlegen des Dateiformats.

Verwenden Sie zum Schreiben der Datei und zum Beenden des Editors

:wq

Auf der Kommandozeile können Sie tun

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

In awk kannst du es versuchen

awk '{print $0 "\r"}'

Oder

awk -v r=$'\r' '{print $0 r}'

Der $'\r' Ist ein Beispiel für ein ANSI-C-Zitat, das von einigen Shells wie ksh93, bash, zsh, mksh unterstützt wird und FreeBSD shnd wahrscheinlich in Ausgabe 8 der Single Unix-Spezifikation enthalten .

Es bietet eine allgemeine Möglichkeit, seltsame Zeichen auszudrücken. Versuchen Sie Folgendes:

awk -v r=$'\U0001F608' '{print $0 r}'
1
trepanger

Eine tragbare Shell-Funktion, die dies erledigt:

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

Damit können Sie tun:

u2dos file >dosfile
1
mikeserv