448 Stimmen

Konvertierung von DOS/Windows newline (CRLF) in Unix newline (LF) in einem Bash-Skript

Wie kann ich programmatisch (d. h. nicht mit vi ) DOS/Windows-Neustriche in Unix?

En dos2unix y unix2dos Befehle sind auf bestimmten Systemen nicht verfügbar. Wie kann ich diese mit Befehlen emulieren wie sed , awk y tr ?

17 Stimmen

Im Allgemeinen installieren Sie einfach dos2unix mit Ihrem Paketmanager, es ist wirklich viel einfacher und existiert auf den meisten Plattformen.

1 Stimmen

Einverstanden! @BradKoch Einfach wie 'brew install dos2unix' auf Mac OSX

2 Stimmen

Nicht alle Benutzer haben Root-Zugriff und können daher keine Pakete installieren. Vielleicht ist das der Grund, warum der Benutzer die sehr spezifische Frage gestellt hat.

426voto

Jonathan Leffler Punkte 694013

Sie können verwenden tr um von DOS nach Unix zu konvertieren; allerdings können Sie dies nur dann sicher tun, wenn CR in Ihrer Datei nur als erstes Byte eines CRLF-Bytepaares vorkommt. Dies ist normalerweise der Fall. Sie verwenden dann:

tr -d '\015' <DOS-file >UNIX-file

Beachten Sie, dass der Name DOS-file ist anders als der Name UNIX-file Wenn Sie versuchen, denselben Namen zweimal zu verwenden, werden Sie keine Daten in der Datei finden.

Der umgekehrte Weg (mit dem Standard-'tr') ist nicht möglich.

Wenn Sie wissen, wie man einen Zeilenumbruch in ein Skript eingibt ( control-V , control-M um Control-M einzugeben), dann:

sed 's/^M$//'     # DOS to Unix
sed 's/$/^M/'     # Unix to DOS

wobei das '^M' das Steuerzeichen M ist. Sie können auch das bash ANSI-C Quotierung Mechanismus zur Angabe des Wagenrücklaufs:

sed $'s/\r$//'     # DOS to Unix
sed $'s/$/\r/'     # Unix to DOS

Wenn Sie dies jedoch sehr oft tun müssen (mehr als einmal, grob gesagt), ist es weitaus sinnvoller, die Konvertierungsprogramme zu installieren (z. B. dos2unix y unix2dos oder vielleicht dtou y utod ) und verwenden Sie sie.

Wenn Sie ganze Verzeichnisse und Unterverzeichnisse verarbeiten müssen, können Sie zip :

zip -r -ll zipfile.zip somedir/
unzip zipfile.zip

Dadurch wird ein Zip-Archiv erstellt, bei dem die Zeilenenden von CRLF in CR geändert werden. unzip setzt dann die konvertierten Dateien wieder an ihren Platz (und fragt Sie Datei für Datei - Sie können antworten: Ja-zu-Alle). Vielen Dank an @vmsnomad für den Hinweis auf dieses Problem.

21 Stimmen

Mit tr -d '\015' <DOS-file >UNIX-file donde DOS-file == UNIX-file führt nur zu einer leeren Datei. Die Ausgabedatei muss leider eine andere Datei sein.

3 Stimmen

@ButtleButkus: Ja, deshalb habe ich auch zwei verschiedene Namen verwendet. Wenn Sie die Eingabedatei zappen, bevor das Programm alles gelesen hat, wie Sie es tun, wenn Sie zweimal denselben Namen verwenden, haben Sie am Ende eine leere Datei. Das ist ein einheitliches Verhalten auf Unix-ähnlichen Systemen. Es erfordert speziellen Code, um das Überschreiben einer Eingabedatei sicher zu handhaben. Befolgen Sie die Anweisungen, und es wird alles gut.

0 Stimmen

Ich meine mich zu erinnern, dass es irgendwo eine Funktion zum Suchen und Ersetzen in Dateien gibt.

101voto

Johan Zicola Punkte 821

Sie können Vim programmatisch verwenden mit der Option -c {command} :

Von DOS zu Unix:

vim file.txt -c "set ff=unix" -c ":wq"

Von Unix zu DOS:

vim file.txt -c "set ff=dos" -c ":wq"

"set ff=unix/dos" bedeutet, dass das Dateiformat (ff) der Datei auf das Unix/DOS-Zeilenendeformat geändert wird.

":wq" bedeutet, dass die Datei auf die Festplatte geschrieben und der Editor beendet wird (so dass der Befehl in einer Schleife verwendet werden kann).

9 Stimmen

Sie können ":x" anstelle von ":wq" verwenden

86voto

ghostdog74 Punkte 305138

Verwendung:

tr -d "\r" < file

Sehen Sie selbst aquí für Beispiele mit sed :

# In a Unix environment: convert DOS newlines (CR/LF) to Unix format.
sed 's/.$//'               # Assumes that all lines end with CR/LF
sed 's/^M$//'              # In Bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//'            # Works on ssed, gsed 3.02.80 or higher

# In a Unix environment: convert Unix newlines (LF) to DOS format.
sed "s/$/`echo -e \\\r`/"            # Command line under ksh
sed 's/$'"/`echo \\\r`/"             # Command line under bash
sed "s/$/`echo \\\r`/"               # Command line under zsh
sed 's/$/\r/'                        # gsed 3.02.80 or higher

Verwenden Sie sed -i für die Konvertierung an Ort und Stelle, z.B., sed -i 's/..../' file .

11 Stimmen

Ich habe eine Variante verwendet, da meine Datei nur \r : tr "\r" "\n" < infile > outfile

1 Stimmen

@MattTodd könnten Sie dies als Antwort posten? die -d wird häufiger angezeigt und hilft nicht bei der "nur \r " Situation.

5 Stimmen

Beachten Sie, dass die vorgeschlagene \r a \n hat den Effekt, dass die Dateien mit doppeltem Abstand angeordnet werden; jede einzelne CRLF-Zeile, die mit DOS endet, wird zu \n\n unter Unix.

59voto

Boris V Punkte 10136

Installieren Sie dos2unix und konvertieren Sie dann eine Datei an Ort und Stelle mit

dos2unix <filename>

Um konvertierten Text in eine andere Datei auszugeben, verwenden Sie

dos2unix -n <input-file> <output-file>

Sie können es unter Ubuntu oder Debian installieren mit

sudo apt install dos2unix

oder unter macOS mit Selbstgebrautes

brew install dos2unix

4 Stimmen

Ich weiß, die Frage fragt nach Alternativen zu dos2unix, aber es ist das erste Google-Ergebnis.

34voto

codaddict Punkte 426877

Mit AWK können Sie das tun:

awk '{ sub("\r$", ""); print }' dos.txt > unix.txt

Mit Perl können Sie das tun:

perl -pe 's/\r$//' < dos.txt > unix.txt

2 Stimmen

Eine schöne, tragbar awk Lösung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X