Konvertieren Sie DOS-Zeilenenden in Linux-Zeilenenden in vim

717

Wenn ich in Windows erstellte Dateien öffne, enden alle Zeilen mit ^M.
Wie lösche ich diese Zeichen auf einmal?

Bert Hekman
quelle
Wenn Sie ein tun hexdump -C badfileund sehen 0x0d 0x0a "\r\n", ist das Ihr Problem.
Yzmir Ramirez

Antworten:

1075

dos2unix ist ein Befehlszeilenprogramm , das dies tut oder :%s/^M//gwenn Sie Ctrl- v Ctrl- verwenden, mum ^ M einzugeben, oder Sie können :set ff=unixund vim wird es für Sie tun.

Text & Tabellen auf der ‚Dateiformat‘ Einstellung sind hier , und das vim wiki eine umfassende hat Seite auf Zeilenende Conversions .

Wenn Sie Dateien häufig hin und her verschieben, möchten Sie sie möglicherweise nicht konvertieren, sondern tun :set ff=dos, damit vim weiß, dass es sich um eine DOS-Datei handelt, und DOS-Konventionen für Zeilenenden verwendet.

pjz
quelle
56
:%s/^M//gsollte sein :%s/\r//g, weil ^Mnur "Match Capital" M "am Anfang der Zeile" bedeutet.
Bunyk
78
Nicht, wenn Sie tun, was in der Antwort steht, und 'Strg-V Strg-M verwenden, um das ^ M einzugeben'.
pjz
2
crtl-v ist nicht gut, unter Windows wird der Inhalt der Zwischenablage in die Befehlszeile eingefügt . Lösung :%s/\r//ghat für mich funktioniert,
Prost
3
@ropata Was Sie unter Windows wollen, ist Strg-Q .
Ruffin
2
Mir muss etwas fehlen, weil set ff=unixes nichts tut. Vielleicht konvertiert es die Datei, aber alle ^MZeichen sind noch da.
Felwithe
276

Ändern Sie die Zeilenenden in der Ansicht:

:e ++ff=dos
:e ++ff=mac
:e ++ff=unix

Dies kann auch als Speichervorgang verwendet werden (: w allein speichert nicht mit den auf dem Bildschirm angezeigten Zeilenenden):

:w ++ff=dos
:w ++ff=mac
:w ++ff=unix

Und Sie können es über die Befehlszeile verwenden:

for file in *.cpp
do 
    vi +':w ++ff=unix' +':q' "$file"
done
Ludvig A. Norin
quelle
4
Vielen Dank. Ich habe vi + ': wq ++ ff = unix' <Dateipfad> für einen Faulen wie mich versucht.
a_secenthusiast
2
Dies sollte die am besten bewertete Antwort sein. :w +ff=unixist so viel schöner als die meisten anderen hier geschriebenen Sachen, und das Bash-Skript ist ein schöner Bonus.
Mkasberg
Die :eBefehle scheinen bei meiner Windows vim-Installation nichts zu bewirken. Meine Ansicht zeigt immer noch die ^MCodes.
Grant Birchmeier
160

Ich benutze normalerweise

:%s/\r/\r/g

Das scheint ein wenig seltsam, funktioniert aber aufgrund der Art und Weise, wie vim mit Linefeeds übereinstimmt. Ich finde es auch einfacher, mich zu erinnern :)


quelle
9
Dies funktioniert konsistent über Plattformen hinweg. Die beste Antwort hier.
Thebigjc
4
Ich hatte noch nie ein Problem damit :set ff=unix, aber die Datei, die ich heute geöffnet habe, muss besonders seltsam gewesen sein. Vim sagte, dass es bereits war, fileformat=unixaber alle Zeilenenden waren ^M. Diese Lösung hat bei mir funktioniert.
Chris B
15
Diese Lösung fügt mir unerwünschte zusätzliche Zeilen hinzu und verdoppelt die Anzahl der Zeilen in der Datei. :%s/\r//garbeitet stattdessen für mich.
Victor Zamanian
3
Victor, deine Dateien haben wahrscheinlich \ r \ n Endungen. Das \ r wird nicht als Zeilenumbruch gelesen, das \ n jedoch. In den Dateien, auf die ich stoße, befindet sich \ r und Sie müssen ein Zeilenumbruchzeichen hinzufügen.
Joeyjoejoejr
2
@ VictorZamanian's :%s/\r//gist die einzige Allzwecklösung - insbesondere für Dateien im gemischten Modus, die eine heterogene Beimischung von Zeilenumbrüchen im DOS- und UNIX-Stil enthalten. Die kanonischen Lösungen (zB :set ff=unix, :e ++ff=unix) übernehmen jede Zeile der aktuellen Pufferende im gleichen Newline Stil. Manchmal tun sie es; manchmal nicht. Stichwort sadface.
Cecil Curry
97

Ich bevorzuge den folgenden Befehl:

:set fileformat=unix

Sie können Ihre Datei auch verwenden macoder dosjeweils in eine Macintosh- oder MS-DOS / MS-Windows-Dateikonvention konvertieren. Und es macht nichts, wenn die Datei bereits im richtigen Format ist.

Weitere Informationen finden Sie in der vim-Hilfe:

:help fileformat
Sylvain Defresne
quelle
1
Dieser Befehl scheint auf meinem Windows vim nichts zu tun. Meine Ansicht enthält immer noch ^MZeichen.
Grant Birchmeier
Das Hinzufügen set fileformat=unixzu meiner .vimrc-Datei hat funktioniert.
Joey Allen
20

:set fileformat=unix von dos nach unix konvertieren.


quelle
1
Dies löste das Problem tatsächlich für mich. Ich konnte diese Zeichen bei der Suche nicht finden.
Kapitän Insaneo
20
:%s/\r+//g

In Vim werden dadurch alle Wagenrückläufe entfernt und nur Zeilenumbrüche hinterlassen.

mercutio
quelle
2
Aus irgendeinem Grund hat das oben für mich unter Windows GVIM nicht funktioniert. Aber wenn es geändert wurde, :%s/\r//gfunktionierte es wie ein Zauber.
Soltysh
1
@soltysh:% s / \ r \ + $ // g
thinker3
14

von: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix

[Esc]:% s / \ r $ //

Alex Gartrell
quelle
+1 für den Hinweis auf die offizielle Dokumentenseite. Informationen zum Verwenden des obigen Links finden Sie im Abschnitt "Konvertieren der aktuellen Datei" auf dieser Seite.
der Blechmann
Dieses + vim -b <Dateiname> hat wie ein Zauber funktioniert, danke, +1
Jan Molak
10

Konvertieren Sie das Verzeichnis der Dateien von dos nach Unix

Suchen Sie über die Befehlszeile und sed alle Dateien im aktuellen Verzeichnis mit der Erweiterung ".ext" und entfernen Sie alle "^ M".

@ https://gist.github.com/sparkida/7773170

find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;

auch, wie oben erwähnt ^ M = Ctrl+V+ Ctrl+M(geben Sie nicht nur das Caret-Symbol "^" und M ein)

Sparkida
quelle
9

dos2unix kann den Dateiinhalt direkt ändern.

Sie können es direkt für die Datei verwenden, ohne dass eine temporäre Dateiumleitung erforderlich ist.

dos2unix input.txt input.txt

Das obige verwendet die angenommene US-Tastatur. Verwenden Sie die -Option 437, um die UK-Tastatur zu verwenden.

dos2unix -437 input.txt input.txt
Venkataramesh Kommoju
quelle
6

Die folgenden Schritte können das Dateiformat für dos in Unix konvertieren:

:e ++ff=dos  Edit file again, using dos file format ('fileformats' is ignored).[A 1]
:setlocal ff=unix    This buffer will use LF-only line endings when written.[A 2]
:w   Write buffer using unix (LF-only) line endings.

Referenz: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix

Ajitomatix
quelle
6

Mit folgendem Befehl:

:%s/^M$//g 

Holen Sie sich das ^MTyp erscheinen CtrlVdann CtrlM. CtrlVfordert Vim auf, das nächste eingegebene Zeichen wörtlich zu nehmen.

Dave Webb
quelle
6

Der Kommentar zum Erscheinen des ^ M hat bei mir funktioniert. Nur "^ M" in mein vi einzugeben, hat nichts gebracht (nicht gefunden). DasCTRL + V CTRL+ MSequenz hat es aber perfekt gemacht.

Mein funktionierender Substitutionsbefehl war

:%s/Ctrl-V Ctrl-M/\r/g

und es sah auf meinem Bildschirm so aus:

:%s/^M/\r/g
Dannid
quelle
4
Sie können :%sanstelle von verwenden :1,$s. %ist eine Abkürzung für 1,$.
der Blechmann
5

Ich habe einen sehr einfachen Weg gefunden: Öffnen Sie die Datei mit nano: nano file.txt

Drücken Sie CTRL+ Ozu retten, aber vor dem Drücken Enter, drücken Sie : ALT+ Dbetwen DOS und Unix / Linux - Zeilenende wechseln, oder: ALT+ Mwechseln betwen Mac und Unix / Linux - Zeilenende drücken Sie dann Enterzu speichern und CTRL+ Xzu beenden.

Stefan Sjöberg
quelle
Auf einem Linux-Server hatte die Datei ^MEndungen. Speichern Sie als Dos, um zu behalten, speichern Sie als Linux, um zu entfernen. kann überprüfen mitcat -v
HattrickNZ
Bei dieser Frage geht es um Vim, nicht um Nano.
Grant Birchmeier
5
:g/Ctrl-v Ctrl-m/s///

CtrlMist das Zeichen \roder der Wagenrücklauf, den DOS-Zeilenenden hinzufügen. CtrlVweist vim an, ein Literal einzufügenCtrlM in die Befehlszeile .

Insgesamt ersetzt dieser Befehl alle \rdurch nichts und entfernt sie von den Zeilenenden.

Rob Wells
quelle
4

Sie können verwenden:

vim somefile.txt +"%s/\r/\r/g" +wq

oder dos2unix utility.

Christy Wald
quelle
3

Sie können den folgenden Befehl verwenden:
:%s/^V^M//g
wobei '^' die Verwendungstaste bedeutet CTRL.

JayG
quelle
2

Der folgende Befehl wird zum Neuformatieren aller .sh-Dateien im aktuellen Verzeichnis verwendet. Ich habe ihn auf meinem Fedora-Betriebssystem getestet.

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done
Maerlyn
quelle
2

Geben Sie in vim Folgendes ein:

:w !dos2unix %

Dadurch wird der Inhalt Ihres aktuellen Puffers an den Befehl dos2unix weitergeleitet und die Ergebnisse über den aktuellen Inhalt geschrieben. Vim wird Sie danach auffordern, die Datei neu zu laden

Tallak Tveide
quelle
2

So führen Sie die Linux-Konsole direkt aus: vim file.txt +"set ff=unix" +wq

CBuzatu
quelle
1

Normalerweise gibt es einen dos2unixBefehl, den Sie dafür verwenden können. Lesen Sie einfach das Handbuch, da sich die GNU- und BSD-Versionen hinsichtlich des Umgangs mit den Argumenten unterscheiden.

BSD-Version:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

GNU-Version:

dos2unix $FILENAME

Alternativ können Sie Ihre eigenen dos2unixmit einer der hier vorgeschlagenen Antworten erstellen , zum Beispiel:

function dos2unix(){
    [ "${!}" ] && [ -f "{$1}" ] || return 1;

    { echo ':set ff=unix';
      echo ':wq';
    } | vim "${1}";
}
dsm
quelle
1

Ich wusste, dass ich das irgendwo gesehen hatte. Hier ist der FreeBSD-Login-Tipp:

Müssen Sie alle diese ^ M Zeichen aus einer DOS-Datei entfernen? Versuchen

tr -d \\r < dosfile > newfile
    -- Originally by Dru <[email protected]>
Albaro Pereyra
quelle
0

Obwohl dieses Thema sehr alt ist, möchte ich noch ein weiteres Zeug aus Wikia einfügen:

%s/\r\+$//g

\nDiese Füllung findet alle Wagenrücklaufzeichen (eine und mehrere Wiederholungen) bis zum Zeilenende und löscht sie, bleibt also einfach bei eol.

Durchschnittslast
quelle
0

Das ist mein Weg. Ich habe eine Datei in dos EOL geöffnet und beim Speichern der Datei wird diese automatisch in Unix EOL konvertiert

autocmd BufWrite * :set ff=unix
Thomas PABST
quelle
0

Wenn Sie eine Datei in NotePad oder NotePad ++ in Windows erstellen und auf Linux bringen und mit vim öffnen, wird am Ende jeder Zeile ^ M angezeigt. Um dies zu entfernen,

Geben Sie an Ihrem Linux-Terminal Folgendes ein

dos2unix filename.ext

Dies wird die erforderliche Magie ausführen.

Santle Camilus
quelle
0

Ich wollte Zeilenumbrüche anstelle der ^ M's. Perl zur Rettung:

perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt

Oder um an stdout zu schreiben:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
user3379574
quelle