Wie kann ich vi
DOS / Windows-Zeilenumbrüche programmgesteuert (dh nicht verwenden ) in Unix konvertieren?
Die Befehle dos2unix
und unix2dos
sind auf bestimmten Systemen nicht verfügbar. Wie kann ich diese mit Befehlen wie sed
/ awk
/ emulieren tr
?
dos2unix
Sie es einfach mit Ihrem Paketmanager. Es ist viel einfacher und auf den meisten Plattformen vorhanden.Antworten:
Sie können verwenden
tr
, um von DOS nach Unix zu konvertieren; Sie können dies jedoch nur sicher tun, wenn CR in Ihrer Datei nur als erstes Byte eines CRLF-Bytepaars angezeigt wird. Dies ist normalerweise der Fall. Sie verwenden dann:Beachten Sie, dass sich der Name
DOS-file
vom Namen unterscheidetUNIX-file
. Wenn Sie versuchen, denselben Namen zweimal zu verwenden, werden keine Daten in der Datei angezeigt.Sie können es nicht umgekehrt machen (mit Standard 'tr').
Wenn Sie wissen , wie Wagenrücklauf in ein Skript ein ( control-V, control-MSteuer-M eingeben), dann gilt :
wobei das '^ M' das Steuer-M-Zeichen ist. Sie können auch den
bash
ANSI-C-Angebotsmechanismus verwenden, um den Wagenrücklauf anzugeben:Wenn Sie dies jedoch sehr oft tun müssen (grob gesagt mehr als einmal), ist es weitaus sinnvoller, die Konvertierungsprogramme (z. B.
dos2unix
undunix2dos
oder oderdtou
undutod
) zu installieren und zu verwenden.Wenn Sie ganze Verzeichnisse und Unterverzeichnisse verarbeiten müssen, können Sie Folgendes verwenden
zip
:Dadurch wird ein Zip-Archiv erstellt, dessen Zeilenenden von CRLF in CR geändert werden.
unzip
setzt dann die konvertierten Dateien wieder ein (und fragt Sie Datei für Datei - Sie können antworten: Ja zu allen). Dank an @vmsnomad für den Hinweis.quelle
tr -d '\015' <DOS-file >UNIX-file
whereDOS-file
== führtUNIX-file
nur zu einer leeren Datei. Die Ausgabedatei muss leider eine andere Datei sein.sed
Option-i
(für In-Place). Die Grenzwerte sind verknüpfte Dateien und Symlinks. Dersort
Befehl hat 'immer' (seit 1979, wenn nicht früher) die-o
Option unterstützt, mit der eine der Eingabedateien aufgelistet werden kann. Dies liegt jedoch teilweise daran, dasssort
alle Eingaben gelesen werden müssen, bevor eine Ausgabe geschrieben werden kann. Andere Programme unterstützen sporadisch das Überschreiben einer ihrer Eingabedateien. In 'The UNIX Programming Environment' von Kernighan & Pike finden Sie ein Allzweckprogramm (Skript), um Probleme zu vermeiden .sed -i $'s/\r$//' filename
-, um an Ort und Stelle zu bearbeiten. Ich arbeite an einem Computer, der keinen Zugang zum Internet hat, daher ist die Installation der Software ein Problem.Schauen Sie sich hier Beispiele an, die Folgendes verwenden
sed
:Verwendung
sed -i
für In-Place-Konvertierung, zsed -i 's/..../' file
.quelle
\r
:tr "\r" "\n" < infile > outfile
-d
wird häufiger vorgestellt und hilft in der "einzigen\r
" Situation nicht weiter.\r
zum\n
Mapping hat die Wirkung von doppelsträngigen Beabstanden der Dateien; Jede einzelne CRLF-Zeile, die unter DOS endet, wird\n\n
unter Unix.Dies mit POSIX zu tun ist schwierig:
POSIX Sed unterstützt
\r
oder nicht\15
. Selbst wenn dies der Fall-i
ist , ist die Option an Ort und Stelle nicht POSIXPOSIX Awk unterstützt
\r
und\15
die-i inplace
Option ist jedoch nicht POSIXd2u und dos2unix sind keine POSIX-Dienstprogramme , aber ex ist
POSIX ex nicht unterstützt
\r
,\15
,\n
oder\12
So entfernen Sie Wagenrückläufe:
So fügen Sie Wagenrückläufe hinzu:
quelle
tr
unterstützt\r
. Sie können also auch verwendenprintf '%s\n' '%!tr -d "\r"' x | ex file
(obwohl dies gewährt wurde, wurde dies entfernt,\r
auch wenn es nicht unmittelbar vorhergeht\n
). Außerdem wird die-b
Option zuex
nicht von POSIX angegeben.Sie können vim programmgesteuert mit der Option -c {Befehl} verwenden:
Dos to Unix:
Unix zu dos:
"set ff = unix / dos" bedeutet, dass das Dateiformat (ff) der Datei in das Unix / DOS-Zeilenendeformat geändert wird
": wq" bedeutet, dass eine Datei auf die Festplatte geschrieben und der Editor beendet wird (wobei der Befehl in einer Schleife verwendet werden kann).
quelle
vi
wird wissen, was:wq
bedeutet. Für diejenigen, die dies nicht tun, bedeuten die 3 Zeichen 1) vi-Befehlsbereich öffnen, 2) schreiben und 3) beenden.Mit AWK können Sie Folgendes tun:
Mit Perl können Sie Folgendes tun:
quelle
awk
Lösung.Verwenden Sie zum Konvertieren einer vorhandenen Datei
Um konvertierten Text in eine andere Datei auszugeben, verwenden Sie
Sie können es unter Ubuntu oder Debian mit installieren
oder unter macOS mit homebrew
quelle
Dieses Problem kann mit Standardwerkzeugen gelöst werden, aber es gibt genügend Fallen für Unvorsichtige, die ich empfehle, den
flip
Befehl zu installieren , der vor über 20 Jahren von Rahul Dhesi, dem Autor von, geschrieben wurdezoo
. Es konvertiert hervorragend Dateiformate und vermeidet beispielsweise die versehentliche Zerstörung von Binärdateien. Dies ist etwas zu einfach, wenn Sie nur herumrennen und jede CRLF ändern, die Sie sehen ...quelle
Die bisher veröffentlichten Lösungen befassen sich nur mit einem Teil des Problems und konvertieren die CRLF von DOS / Windows in die LF von Unix. der Teil sind vermisst sie ist , dass DOS Verwendung CRLF als Zeilentrennzeichen , während Unix LF als Linie verwendet Terminator . Der Unterschied besteht darin, dass eine DOS-Datei (normalerweise) nach der letzten Zeile in der Datei nichts mehr enthält, während dies unter Unix der Fall ist. Um die Konvertierung ordnungsgemäß durchzuführen, müssen Sie diesen endgültigen LF hinzufügen (es sei denn, die Datei hat die Länge Null, dh sie enthält überhaupt keine Zeilen). Meine Lieblingsbeschwörung dafür (mit ein wenig zusätzlicher Logik für den Umgang mit CR-getrennten Dateien im Mac-Stil und nicht für belästigende Dateien, die bereits im Unix-Format vorliegen) ist ein bisschen Perl:
Beachten Sie, dass dadurch die Unixified-Version der Datei an stdout gesendet wird. Wenn Sie die Datei durch eine Unixified-Version ersetzen möchten, fügen Sie das Perl-
-i
Flag hinzu.quelle
Wenn Sie keinen Zugriff auf dos2unix haben , diese Seite jedoch lesen können, können Sie dos2unix.py von hier aus kopieren / einfügen .
Cross-posted vom Superuser .
quelle
dos2unix
konvertiert standardmäßig alle Eingabedateien. Ihre Verwendung impliziert-n
Parameter. Und der Realdos2unix
ist ein Filter, der aus stdin liest und in stdout schreibt, wenn die Dateien nicht angegeben werden.Super super einfach mit PCRE;
Als Skript oder durch
$@
Ihre Dateien ersetzen .quelle
--
. Ich habe mich für diese Lösung entschieden, weil sie für mich leicht zu verstehen und anzupassen ist. Zu Ihrer Information, dies ist, was die Schalter tun:-p
Nehmen Sie eine "while input" -Schleife an,-i
bearbeiten Sie die Eingabedatei an Ort und Stelle,-e
führen Sie den folgenden Befehl ausEine noch einfachere awk-Lösung ohne Programm:
Technisch gesehen ist '1' Ihr Programm, für b / c awk ist eines erforderlich, wenn die Option angegeben ist.
UPDATE : Nachdem ich diese Seite zum ersten Mal seit langer Zeit wieder besucht hatte, stellte ich fest, dass noch niemand eine interne Lösung veröffentlicht hat. Hier ist eine:
quelle
awk -v RS='\r\n' '1' dos.txt > unix.txt
awk
oder einesed
Lösung. Außerdem müssen Sie verwendenwhile IFS= read -r line
, um die Eingabezeilen originalgetreu beizubehalten, da sonst führende und nachfolgende Leerzeichen abgeschnitten werden (alternativ können Sie imread
Befehl keinen Variablennamen verwenden und damit arbeiten$REPLY
).Interessanterweise hat mein Git-Bash auf Windows
sed ""
schon den Trick gemacht:Ich vermute, dass sed sie beim Lesen von Zeilen aus der Eingabe ignoriert und immer Unix-Zeilenenden in die Ausgabe schreibt.
quelle
Das hat bei mir funktioniert
quelle
Ich musste nur über dieselbe Frage nachdenken (auf Windows-Seite, aber gleichermaßen für Linux). Überraschenderweise erwähnte niemand eine sehr automatisierte Methode zur CRLF <-> LF-Konvertierung für Textdateien mit der guten alten
zip -ll
Option (Info-ZIP):HINWEIS: Dadurch wird eine Zip-Datei erstellt, die die ursprünglichen Dateinamen beibehält, aber die Zeilenenden in LF konvertiert. Dann
unzip
würden die Dateien als zip'ed extrahiert, dh mit ihren ursprünglichen Namen (aber mit LF-Endungen), wodurch die lokalen Originaldateien, falls vorhanden, überschrieben werden.Relevanter Auszug aus
zip --help
:quelle
Für Mac OSX, wenn Sie Homebrew installiert haben [ http://brew.sh/ weibliches [1 ]
Stellen Sie sicher, dass Sie Kopien der Dateien erstellt haben, da dieser Befehl die vorhandenen Dateien ändert. Mit der Option -c mac ist der Switch mit osx kompatibel.
quelle
-c mac
, da dies nur zum Konvertieren vonCR
Zeilenumbrüchen vor OS X dient. Sie möchten diesen Modus nur für Dateien von und nach Mac OS 9 oder früher verwenden.TIMTOWTDI!
Basierend auf @GordonDavisson
Man muss die Möglichkeit in Betracht ziehen
[noeol]
...quelle
Sie können awk verwenden. Setzen Sie das Datensatztrennzeichen (
RS
) auf einen regulären Ausdruck, der allen möglichen Zeilenumbrüchen entspricht. Setzen Sie das Trennzeichen für den Ausgabedatensatz (ORS
) auf das Zeilenumbruchzeichen im Unix-Stil.quelle
git diff
zeigt ^ M, bearbeitet in vim)Unter Linux ist es einfach, ^ M (Strg-M) mit sed in * nix newlines (^ J) zu konvertieren.
Es wird so etwas auf der CLI geben, es wird tatsächlich einen Zeilenumbruch im Text geben. Das \ gibt das ^ J jedoch an sed weiter:
Sie erhalten dies, indem Sie bei der Eingabe ^ V (Strg-V), ^ M (Strg-M) und \ (Backslash) verwenden:
quelle
Da in der Frage sed erwähnt wird, ist dies der einfachste Weg, sed zu verwenden, um dies zu erreichen. Der Ausdruck besagt, dass alle Wagenrückläufe und Zeilenvorschübe nur durch Zeilenvorschübe ersetzt werden. Das ist es, was Sie brauchen, wenn Sie von Windows zu Unix wechseln. Ich habe überprüft, ob es funktioniert.
quelle
Als Erweiterung der Unix-zu-DOS-Lösung von Jonathan Leffler zur sicheren Konvertierung in DOS, wenn Sie sich über die aktuellen Zeilenenden der Datei nicht sicher sind:
Dadurch wird überprüft, ob die Zeile nicht bereits in CRLF endet, bevor sie in CRLF konvertiert wird.
quelle
Ich habe ein Skript basierend auf der akzeptierten Antwort erstellt, damit Sie es direkt konvertieren können, ohne am Ende eine zusätzliche Datei zu benötigen und diese anschließend zu entfernen und umzubenennen.
Stellen Sie einfach sicher, dass bei einer Datei wie "file1.txt" "file1.txt2" noch nicht vorhanden ist oder diese überschrieben wird. Ich verwende diese Datei als temporären Speicherort für die Datei.
quelle
Mit Bash 4.2 und neuer können Sie so etwas verwenden, um die nachfolgende CR zu entfernen, die nur Bash-integrierte Funktionen verwendet:
quelle
Ich habe sed 's / ^ M $ //' file.txt unter OSX sowie verschiedene andere Methoden ausprobiert ( http://www.thingy-ma-jig.co.uk/blog/25-11-2010/fixing- dos-line-endings oder http://hintsforums.macworld.com/archive/index.php/t-125.html ). Keine funktionierte, die Datei blieb unverändert (übrigens wurde Strg-v Enter benötigt, um ^ M zu reproduzieren). Am Ende habe ich TextWrangler verwendet. Es ist nicht streng Befehlszeile, aber es funktioniert und es beschwert sich nicht.
quelle