Wie konvertiere ich den Zeilenumbruch ^ M in einen "normalen" Zeilenumbruch in einer in vim geöffneten Datei?

481

vim wird in jeder Zeile mit ^ M angezeigt

Wie kann ich dies durch einen "normalen" Zeilenumbruch ersetzen?

ByteNirvana
quelle
3
Bitte ändern Sie die Lösung in das Dateiformat, da dies die sauberste Lösung ist.
Erikbwork
1
Ich weiß, dass es bei dieser Frage um vim geht, aber einige andere Google-Suchanfragen landen ebenfalls in diesem Thread. Wenn Sie also Eclipse auf Ihrem System installiert haben, können Sie den Zeilenbegrenzer mit wenigen Klicks für eine einzelne Datei oder einen vollständigen Ordnerbaum
Teddy
Mir gefällt, wie man normale Zeilenumbrüche "normal" nennt - im Gegensatz zu diesen ^ M Zeilenumbrüchen :-)
DerMike

Antworten:

134

Dies ist das einzige, was für mich funktioniert hat:

: e ++ ff = dos

Gefunden unter: http://vim.wikia.com/wiki/File_format

Pam
quelle
Arbeitete unter Windows 7 Vim7.4
schuess
19
:e ++ff=dosgefolgt von :set ff=unixkonvertiert die Endungen in ein normales Format.
Mateen Ulhaq
Die Antwort der Lösung hat bei mir nicht funktioniert, nur die Befehle @MateenUlhaq haben mir geholfen.
Edenshaw
577

Befehl

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

Wo <Ctrl-V><Ctrl-M>bedeutet, geben Sie Ctrl+ Vdann Ctrl+ M.

Erläuterung

:%s

Ersatz,% = alle Zeilen

<Ctrl-V><Ctrl-M>

^ M-Zeichen (Strg-V ist eine Vim-Methode zum Schreiben des Strg-Zeichens ^ und Strg-M schreibt das M nach dem regulären Ausdruck, was zu einem ^ M-Sonderzeichen führt.)

/\r/

mit neuer Zeile ( \r)

g

Und das global (nicht nur beim ersten Auftreten in der Leitung).

LeopardSkinPillBoxHat
quelle
21
Die ^ M-Zeichen wurden entfernt, der Wagenrücklauf wird jedoch nicht eingefügt.
Luckytaxi
14
@jumpnett - Sie müssen die Tastenakkorde Strg-V / Strg-M drücken und dürfen dies nicht als wörtlichen Text eingeben.
LeopardSkinPillBoxHat
33
Dies ist definitiv die richtige Antwort auf die Frage. Wenn Sie ein ^ M gefolgt von einer neuen Zeile haben, möchten Sie die neue Zeile beibehalten, aber das ^ M entfernen. Wenn Sie die andere Ersetzung unter der doppelten Leerstelle Ihrer Datei vornehmen.
Dlamblin
12
Wenn Sie immer noch einen Wagenrücklauf vermissen (dh das ^ M wurde entfernt, aber alles in eine einzelne Zeile eingeschlossen), gehen Sie wie folgt vor: :%s/<Ctrl-V><Ctrl-M>/\r/g(wobei \ r das ^ M durch eine neue Zeile ersetzt).
William Turrell
7
Wenn Sie Vim unter Windows ausführen, müssen Sie <Strg-Q> anstelle von <Strg-V> verwenden.
GrandAdmiral
418

Unter Linux und Mac OS funktioniert Folgendes:

:%s/^V^M/^V^M/g

wo ^V^Mbedeutet Typ Ctrl+ V, dann Ctrl+ M.

Hinweis: Unter Windows möchten Sie wahrscheinlich ^Qanstelle von verwenden ^V, da standardmäßig ^Vdas Einfügen von Text zugeordnet ist.

Paul Tomblin
quelle
3
Warum wurde dies abgelehnt? Es funktioniert auch dann, wenn Ihre Datei in einer Zeile zusammengefasst ist, weil sie das falsche Zeilenende hat.
Paul Tomblin
2
Nein. Mein Weg ersetzt das Zeilenende in der Datei durch das richtige Zeilenende.
Paul Tomblin
7
Dies ist ein anderes Problem, wenn Ihre Datei KEINE neuen Zeilen enthält, was meiner Meinung nach häufiger vorkommt. FYI ^ M kann von \ r
dlamblin
12
Dies ist ein zutiefst mysteriöser Befehl, der jedoch für mich auf einem Mac funktioniert.
Eric Walker
5
Ich fand, dass das Äquivalent %s/\r/\r/gunter MacVim für eine Datei, die nur ^Mam Zeilenende angezeigt wird (eine lange Zeile in MacVim-Begriffen), gut funktioniert. \ R bedeutet eindeutig verschiedene Dinge im Muster im Vergleich zu Ersatzteilen dieses Befehls.
RichVel
184

Innerhalb vim, Blick auf das Dateiformat - DOS oder Unix:

:set filetype=unix

:set fileformat=unix

Die Datei wird ohne Wagenrücklaufzeichen (CR, ^ M) zurückgeschrieben.

Jonathan Leffler
quelle
3
use: set fileformat = unix Bei den meisten Konfigurationen ändert der Dateityp nur den verwendeten Syntaxtyp.
derGral
6
Dies behebt den Fehler, den ich hatte ... Vim begann zu glauben, meine UNIX-formatierte Datei sei Windows, und neu geänderte Zeilen zeigten ^ M im Git-Diff.
Thomas Hunter II
Muss systemabhängig sein. Heute hat dieser funktioniert. Der Befehl set wird übrigens in vim ausgeführt.
Gbarry
1
großartig! weil das Dateiformat dos ist, setzen Sie es auf Unix und es ist in
Ordnung
3
Dies funktioniert auch auf vi BTW, und Sie können set ff=unixals kleine Verknüpfung auf die gleiche Weise fteine Verknüpfung fürfiletype
Posva
110

In einer Datei, die ich mit BBEdit in MacVim erstellt hatte, wurden ^Manstelle der regulären Zeilen eine Reihe von Zeilenrückgaben angezeigt . Der folgende String-Ersatz hat das Problem behoben - ich hoffe, dies hilft:

:%s/\r/\r/g

Es ist interessant, weil ich Zeilenumbrüche durch dasselbe Zeichen ersetze, aber ich nehme an, dass Vim nur ein neues \ r benötigt, um korrekt angezeigt zu werden. Es würde mich interessieren, warum dies funktioniert.

netpoetica
quelle
1
Es gibt eine Tendenz für Suchfunktionen, breitere Regeln zum Erkennen von Zeilenende-Sequenzen zu akzeptieren. Aber \ r hat eine bestimmte Bedeutung, wenn es als Daten geschrieben wird.
Gbarry
Dies funktionierte für mich in Windows gVim, um eine Datei zu sortieren, die keine Zeilenumbrüche hatte, sondern nur viele ^ M.
Flash
2
Von allen auf dieser Seite angebotenen Lösungen war dies das einzige Muster, das für mich beim Entfernen von ^ M aus einer CSV-Datei funktioniert hat. Verwenden von MacVim.
B6431
+1 Arbeitete auch für mich beim SSHing zu Ubuntu Trusty von Windows mit Mobaterm
Carl
Dies schien also alle \rZeichen zu ersetzen, \nobwohl dies \rals Ersatz angegeben wurde. Nicht beschweren, genau das wollte ich. Einfach nur komisch.
Donut
34

Verwenden Sie zunächst :set ff?, um das Dateiformat Ihrer Datei zu ermitteln.

Ich denke, es könnte sein unix, dann besteht das Problem darin, dass Ihre Datei mit dem fileformat=dosHinzufügen von "^ M ^ J" am Zeilenende erstellt wurde, aber flieformat=unixnur mit dem Entfernen des "^ J" vom Zeilenende gelesen wurde und das "^ M" dort belassen wurde.

:e ++ff=dosGeben Sie einfach in die Vim-Befehlszeile ein, um das Format Ihrer Datei von Unix auf dos zu ändern. Es sollte das Problem lösen. Wenn nicht, :%s/\r//gsollte Ihnen helfen.

Chenxsan
quelle
3
Ich musste beides tun. :e ++ff=dosdann :set ff=unixund:w
Max
29

Um das übereinstimmende ^ M-Zeichen zu erhalten, musste ich es visuell auswählen und dann den Befehl zum Kopieren in die Zwischenablage des Betriebssystems verwenden, um es abzurufen. Sie können es testen, indem Sie nach dem Zeichen suchen, bevor Sie den Befehl replace ausführen.

/^M

sollte die erste schlechte Zeile auswählen

:%s/^M/\r/g

ersetzt alle fehlerhaften ^ M durch Wagenrückläufe.

Dies ist als Funktion in MacVim, das auf gvim 7 basiert.

BEARBEITEN:

Dieses Problem tritt erneut auf meinem Windows 10-Computer auf, auf dem Ubuntu für Windows installiert ist, und ich denke, dies führt zu Dateiformatproblemen bei vim. In diesem Fall hat das Ändern von ff in Unix, Mac oder Dos nichts anderes getan, als das ^ M in ^ J und wieder zurück zu ändern.

Die Lösung in diesem Fall:

:%s/\r$/ /g
:%s/ $//g

Der Grund, warum ich diesen Weg gegangen bin, ist, dass ich sicherstellen wollte, dass ich mit meiner Datei zerstörungsfrei bin. Ich hätte es tun können, :%s/\r$//gaber das hätte die Wagenrückläufe sofort gelöscht und hätte unerwartete Ergebnisse haben können. Stattdessen konvertieren wir das singuläre CR-Zeichen, hier ein ^ M-Zeichen, in ein Leerzeichen und entfernen dann alle Leerzeichen am Zeilenende (was für mich unabhängig davon ein wünschenswertes Ergebnis ist).

Es tut mir leid, dass ich eine alte Frage wiederbelebt habe, die längst beantwortet wurde, aber es schien einige Verwirrung zu geben, und ich dachte, ich würde helfen, einiges davon zu klären, da dies bei Google-Suchen hoch auftaucht.

Metagrapher
quelle
1
Durch Drücken von Strg-V Strg-M wird möglicherweise auch das Zeichen fwiw eingefügt. aber das \ r ist das, was den richtigen Wagenrücklauf einfügt.
Metagrapher
1
Dies ist die richtige Antwort. Verwenden Sie wie oben beschrieben <ctrl-v> <ctrl-m>, um das Literal ^ M in den Befehl einzufügen.
Carlosayam
1
Ich stimme zu, obwohl ich sicher bin, dass ich nicht gepostet hätte, wenn das zum Zeitpunkt der ursprünglichen Veröffentlichung für mich funktioniert hätte. ;)
Metagrapher
22

Keines davon hat bei mir funktioniert, also habe ich es versucht, was funktioniert hat:

Art :%s/

Drücken Sie CTRL-VCTRL-M

Art //g

Drücken Sie Enter

Der Gesamtbefehl in Vim sollte also so aussehen :%s/^M//g

Was dies bewirkt: :%s(Suchen und Ersetzen) /^M/(dieses Symbol) /(ohne Zeichen) g(global).

d -_- b
quelle
Knall an !! Funktioniert auf dem Mac.
Shamail
17

^ M wird durch abgerufen Ctrl+ Vund M, so zu tun

s/^M//g
Andrew Sledge
quelle
15

Ohne Strg verwenden zu müssen: :%s/\r$//

BHarman
quelle
1
So mache ich es auch. Ich erinnere mich einfach nie an den Befehl
Pixel 67
Dies ist die empfohlene Methode zum Entfernen dieser Endungen.
Metagrapher
13

Einfache Sache, die für mich funktioniert hat

dos2unix   filename
Shahzeb Khan
quelle
12

Ich habe das mit sed gemacht:

sed -i -e 's/\r/\n/g' filename

Freedom_Ben
quelle
Bist du sicher, dass das funktioniert? Unter OSX: sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand
Ja, es funktioniert (ich benutze es oft), aber unter OSX funktioniert es möglicherweise nicht, wenn Sie die GNU-Version von sed nicht installiert haben. Die Version von sed, die Apple standardmäßig ausliefert, unterscheidet sich (leider) erheblich von der GNU-Version, die in allen Linux-Distributionen ausgeliefert wird. Weitere Hilfe finden Sie in der Antwort auf diese Frage: stackoverflow.com/q/30003570/2062384
Freedom_Ben
Danke @Freedom_Ben. Es klingt also so, als würde dies für GNU funktionieren, dann sedaber nicht für BSD sed(wie unter OSX). Jeder, der Zeilenumbrüche behebt, arbeitet wahrscheinlich mit einer Mischung von Betriebssystemen. Daher ist es hilfreich, klar zu machen, wann die Antwort funktionieren wird.
Armand
10

Was ist mit nur: :%s/\r//g Das hat bei mir total funktioniert.

Dies dient nur dazu, das Zeilenende aller Zeilen zu bereinigen, das ^ M zu entfernen und fertig.

tonatiuhnb
quelle
9

Es gibt viele andere Antworten auf diese Frage, aber dennoch funktioniert Folgendes am besten für mich, da ich eine Befehlszeilenlösung benötigte:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

Erläuterung:

  • Öffnen Sie, ohne .vimrc-Dateien zu laden myfile
  • Lauf :e ++ff=dos , um ein erneutes Laden der gesamten Datei als Dos-Zeilenenden zu erzwingen.
  • Führen Sie :w ++ff=unixdiese Option aus , um die Datei mit Unix-Zeilenenden zu schreiben
  • Hör auf vim
Micah Smith
quelle
3
Vielen Dank! Dies hat mein Problem behoben und fand es nützlich, es in Skripten zu verwenden
Peddipaga
8

Ctrl+ Mminimiert mein Fenster, Ctrl+ Enterfügt jedoch tatsächlich ein ^MZeichen ein. Ich musste auch darauf achten, den CtrlSchlüssel zwischen den Drücken nicht abzuheben .

Die Lösung für mich war also:

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

Wo <Ctrl-V><Ctrl-Enter>Mittel zu drücken und gedrückt halten Ctrl , drücken und loslassen V, drücken und loslassen Enter, und dann Freigabe Ctrl .

Wenn Sie an einer von Windows generierten Datei arbeiten

Die obige Lösung fügt eine zusätzliche Zeile zwischen vorhandenen Zeilen hinzu, da \rnach dem bereits eine unsichtbare vorhanden ist ^M.

Um dies zu verhindern, möchten Sie die ^MZeichen löschen , ohne sie zu ersetzen.

:%s/<Ctrl-V><Ctrl-Enter>//g

Wobei %"in diesem Puffer" s"Ersatz" /bedeutet, "das folgende Muster finden " bedeutet, <Ctrl-V><Ctrl-Enter>sich auf die Tasten bezieht, die gedrückt werden müssen, um das ^MZeichen zu erhalten (siehe oben), //bedeutet "mit nichts" (oder "mit dem Muster") zwischen diesen beiden Schrägstrichen, die leer sind ") und gein Flag ist, das" global "bedeutet, im Gegensatz zum ersten Vorkommen in einer Zeile.

CrannDarach
quelle
7

Das hat bei mir funktioniert:

  1. Stellen Sie das Dateiformat auf Unix ein ( \nZeilenende)
  2. Speicher die Datei

Also in vim:

:set ff=unix
:w
Stryker
quelle
1
Dieser funktionierte für mich, während die akzeptierte Antwort dies nicht tat.
Marcello Romani
7

In meinem Fall,

Nichts oben hat funktioniert, ich habe eine CSV-Datei von meinem Mac auf einen Linux-Computer kopieren lassen und alle oben genannten Befehle verwendet, aber nichts hat geholfen, außer dem folgenden

tr "\015" "\n" < inputfile > outputfile

Ich hatte eine Datei, in der ^ M Zeichen zwischen Zeilen wie unten geschaltet waren

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,
Vishwanath gowda k
quelle
5

Alternativ gibt es Open-Source-Dienstprogramme namens dos2unix und unix2dos, die genau dies tun. Auf einem Linux-System sind sie wahrscheinlich standardmäßig installiert. Für ein Windows-System können Sie diese unter anderem von http://www.bastet.com/ herunterladen .

ConcernedOfTunbridgeWells
quelle
5
sed s/^M//g file1.txt > file2.txt

wobei ^ M durch gleichzeitiges Drücken der 3 Tasten eingegeben wird, ctrl + v + m

Blauer Diamant
quelle
4

Verwenden Sie das Dienstprogramm dos2unix, wenn die Datei unter Windows erstellt wurde. Verwenden Sie das Dienstprogramm mac2unix, wenn die Datei unter Mac erstellt wurde. :) :)

Ramesh
quelle
Ich habe noch nie von mac2unix gehört und hätte wieder positiv gestimmt, wenn ich könnte!
Kuf
Hurra! Das ist der richtige Weg!
Privat
3

Verwenden Sie einen dieser Befehle:

:%s/\r//g

Oder

:%s/\r\(\n\)/\1/g
Muhammad Reda
quelle
2

Das hat bei mir funktioniert:

:% s/\r\n/\r
ContextSwitch
quelle
1

Um Tastenanschläge zu speichern , können Sie die Eingabe von Ctrl+ VCtrl+ vermeiden, Mindem Sie diese in eine Zuordnung einfügen. Öffnen Sie einfach eine Datei mit einem ^ M-Zeichen, ziehen Sie sie heraus und fügen Sie sie in eine Zeile wie diese in Ihrer .vimrc ein:

nnoremap <Leader>d :%s/^M//g<CR>
agouge
quelle
1

Keiner dieser Vorschläge hat für mich funktioniert, da ich es geschafft habe, ^Mwährend der Arbeit mit vim und eclipse eine Menge Zeilenumbrüche zu bekommen . Ich vermute, dass ich auf einen externen Fall gestoßen bin, aber falls es jemandem hilft, den ich getan habe.

:%s/.$//g

Und es hat mein Problem gelöst

Rogermushroom
quelle
Dadurch wird JEDES Zeichen am Ende einer Zeile entfernt. Wenn Sie eine Zeile haben, die aus irgendeinem Grund nicht mit ^ M abgeschlossen ist, entfernen Sie dieses Zeichen ebenfalls und wären unerwartet. Dies sollte nicht der Fall sein, aber falls dies der Fall ist und Sie dies nicht wissen, können Sie Ihre Datei auf eine sehr schwer zu identifizierende Weise beschmutzen.
Metagrapher
1
:g/^M/s// /g

Wenn Sie mit ^MeingebenShift+6 Caps+M wird dies nicht akzeptiert.

Sie müssen eingeben ctrl+v ctrl+m.

Shravan Kumar
quelle
1

^Mgibt unerwünschte Zeilenumbrüche. Um dies zu handhaben, können wir den sedBefehl wie folgt verwenden:

sed 's/\r//g'
Manoj Kumar
quelle
idk warum wurde dies auf -1 herabgestuft ... weil es sed verwendet? Sie können die gleiche Substitution in vim durchführen und es sollte funktionieren
Metagrapher
1

Entfernen set binarySie einfach in Ihrer .vimrc!

Falcucci
quelle
In einem anderen Thread wurde "set binary" empfohlen, um das automatische Einfügen einer neuen Zeile zu beseitigen.
Dexter2305
1

Zur Nutzung sedauf MacOS, dies zu tun:

sed -i.bak $'s/\r//' <filename>

Erläuterung: Die $'STRING'Syntax bezieht sich hier auf die Bash-Shell. Macs werden nicht \rals Sonderzeichen behandelt . Indem Sie die Befehlszeichenfolge in angeben, $''weisen Sie die Shell an, sie \rdurch das \rim ANSI-C-Standard angegebene tatsächliche Zeichen zu ersetzen .

Nitin Nain
quelle
0

"Diese Funktion behält die Liste der Sprünge bei

fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
    set ff=unix
    w!
    "%s/\%x0d$//e
catch /E32:/
    echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()
SergioAraujo
quelle
Was ist in diesem Fall falsch an der Verwendung des nativen dos2unix-Befehls von * NIX? linux.die.net/man/1/dos2unix
Metagrapher
0

Ich habe einen Nachmittag damit verbracht, mit \ n Strg-V 012 zu kämpfen (beide liefern mir null). & arbeitete mich durch diesen Thread, bis ich Metagraphen erreichte.

\r hat gut funktioniert für mich!

/),/s/),/)\r/g

drehte so etwas um:

Blacklist-Extra: i386 (0,4,1, 0,4,1 + nmu1), libmount1: i386 (2,20,1-5,1, 2,20,1-5,2), libblkid1: i386 (2,20,1-5,1, 2,20,1-5,2) , libapt-pkg4.12: i386 (0.9.7.4, 0.9.7.5), nmap: i386 (6.00-0.1, 6.00-0.2), libsane-common: i386 (1.0.22-7.3,

in so etwas:

26 libwv-1.2-4: i386 (1.2.9-3, automatisch)
27 openjdk-6-jre-headless: i386 (6b24-1.11.4-3, automatisch)
28 jed: i386 (0.99.19-2.1)

Magie. Ich bin zutiefst dankbar

user1997684
quelle