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?


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.


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

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 :)


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

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.


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.


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


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)


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



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.


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

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.


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.


4

Sie können verwenden:

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

oder dos2unix utility.


3

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


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

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


2

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


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}";
}

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 <genesis@istar.ca>

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.


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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.