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
?
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
?
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.
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.
@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.
Ich meine mich zu erinnern, dass es irgendwo eine Funktion zum Suchen und Ersetzen in Dateien gibt.
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).
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
.
Ich habe eine Variante verwendet, da meine Datei nur \r
: tr "\r" "\n" < infile > outfile
@MattTodd könnten Sie dies als Antwort posten? die -d
wird häufiger angezeigt und hilft nicht bei der "nur \r
" Situation.
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.
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
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.
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.