Comment convertir le saut de ligne ^ M en saut de ligne 'normal' dans un fichier ouvert dans vim?

481

vim apparaît sur chaque ligne se terminant par ^ M

Comment puis-je remplacer cela par un saut de ligne «normal»?

ByteNirvana
la source
3
Veuillez remplacer la solution par la modification du format de fichier car c'est la solution la plus propre.
erikbwork
1
Je sais que cette question concerne vim, mais d'autres recherches Google arrivent également dans ce fil. Donc, si Eclipse est installé sur votre système, vous pouvez convertir le délimiteur de ligne pour un seul fichier ou une arborescence complète de fichiers en quelques clics: stackoverflow.com/a/7019737/1364747
Teddy
J'aime la façon dont vous appelez les sauts de ligne normaux "normaux" - contrairement à ces ^ M sauts de ligne :-)
DerMike

Réponses:

134

C'est la seule chose qui a fonctionné pour moi:

: e ++ ff = dos

Trouvé sur: http://vim.wikia.com/wiki/File_format

Pam
la source
A travaillé sur windows7 Vim7.4
schuess
19
:e ++ff=dossuivi de :set ff=unixconvertira les terminaisons dans un format sain.
Mateen Ulhaq
La réponse de la solution n'a pas fonctionné pour moi, seules les commandes @MateenUlhaq m'ont aidé.
Edenshaw
577

Commander

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

<Ctrl-V><Ctrl-M>signifie taper Ctrl+ Vpuis Ctrl+ M.

Explication

:%s

substitut,% = toutes les lignes

<Ctrl-V><Ctrl-M>

^ M caractères (le Ctrl-V est une façon Vim d'écrire le caractère Ctrl ^ et Ctrl-M écrit le M après l'expression régulière, résultant en ^ M le caractère spécial)

/\r/

avec une nouvelle ligne ( \r)

g

Et faites-le globalement (pas seulement la première occurrence sur la ligne).

LeopardSkinPillBoxHat
la source
21
il a supprimé les caractères ^ M mais n'insère pas le retour chariot.
luckytaxi
14
@jumpnett - Vous devez appuyer sur les accords clés Ctrl-V / Ctrl-M, et non pas entrer cela comme texte textuel.
LeopardSkinPillBoxHat
33
C'est certainement la bonne réponse à la question, si vous avez un ^ M suivi d'une nouvelle ligne, vous souhaitez conserver la nouvelle ligne mais supprimer le ^ M. Faire l'autre substitution ci-dessous double-espace votre fichier.
dlamblin
12
Si vous manquez toujours un retour chariot (c'est-à-dire que le ^ M a été supprimé mais que tout est encapsulé sur une seule ligne), faites: :%s/<Ctrl-V><Ctrl-M>/\r/g(où \ r remplace le ^ M par une nouvelle ligne).
William Turrell
7
Si vous exécutez Vim sur Windows, vous devrez utiliser <Ctrl-Q> au lieu de <Ctrl-V>.
GrandAdmiral
418

Sous Linux et Mac OS, les travaux suivants,

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

^V^Msignifie taper Ctrl+ V, puis Ctrl+ M.

Remarque: sous Windows, vous souhaitez probablement utiliser à la ^Qplace de ^V, car par défaut, il ^Vest mappé pour coller du texte.

Paul Tomblin
la source
3
Pourquoi cela at-il obtenu un downvote? Cela fonctionne, même lorsque votre fichier est écrasé sur une seule ligne car sa fin de ligne est incorrecte.
Paul Tomblin
2
Non. Ma façon remplace tout ce qui est la fin de ligne dans le fichier par la fin de ligne correcte.
Paul Tomblin
7
C'est pour un problème différent lorsque votre fichier ne contient PAS de nouvelles lignes, ce qui, je l'admets, est plus courant. FYI ^ M peut être égalé par \ r
dlamblin
12
C'est une commande profondément mystérieuse, mais elle fonctionne pour moi sur un Mac.
Eric Walker
5
J'ai trouvé que l'équivalent %s/\r/\r/gfonctionnait bien sur MacVim pour un fichier ne montrant qu'à la ^Mfin des lignes (une longue ligne en termes MacVim). Clairement \ r signifie différentes choses dans le modèle par rapport aux pièces de rechange de cette commande.
RichVel
184

Dans vim, regardez le format de fichier - DOS ou Unix:

:set filetype=unix

:set fileformat=unix

Le fichier sera réécrit sans retour chariot (CR, ^ M).

Jonathan Leffler
la source
3
use: set fileformat = unix Pour la plupart des configurations, typefichier modifie uniquement le type de syntaxe utilisé.
derGral
6
Cela a corrigé le bug que j'avais ... Vim a commencé à penser que mon fichier au format UNIX était Windows et que les lignes nouvellement modifiées montraient ^ M dans le diff git.
Thomas Hunter II
Doit dépendre du système. Aujourd'hui, celui-ci a fonctionné. La commande set se fait dans vim, btw.
gbarry
1
parce que le format de fichier est dos, définissez-le sur unix, et c'est ok
zhaozhi
3
Cela fonctionne également sur vi BTW, et vous pouvez faire set ff=unixcomme un petit raccourci de la même manière ftqu'un raccourci pourfiletype
Posva
110

Un fichier que j'avais créé avec BBEdit vu dans MacVim affichait un tas de ^Mretours de ligne au lieu de retours réguliers. Le remplacement de chaîne suivant a résolu le problème - espérons que cela aide:

:%s/\r/\r/g

C'est intéressant parce que je remplace les sauts de ligne par le même caractère, mais je suppose que Vim a juste besoin d'obtenir un nouveau \ r pour s'afficher correctement. Je serais intéressé de connaître les mécanismes sous-jacents de la raison pour laquelle cela fonctionne.

netpoetica
la source
1
Les fonctions de recherche ont tendance à accepter des règles plus larges pour reconnaître les séquences de fin de ligne. Mais \ r a une signification spécifique lorsqu'il est écrit en tant que données.
gbarry
Cela a fonctionné pour moi dans Windows gVim pour trier un fichier qui n'avait pas de sauts de ligne, juste beaucoup de ^ M à la place.
flash
2
De toutes les solutions proposées sur cette page, c'était le seul modèle qui a fonctionné pour moi en supprimant ^ M d'un fichier csv. Utilisation de MacVim.
B6431
+1 A également fonctionné pour moi lors de la connexion SSH à Ubuntu Trusty à partir de Windows en utilisant Mobaterm
Carl
Donc, cela a semblé remplacer tous les \rpersonnages \nmalgré le fait qu'il soit spécifié \rcomme remplaçant. Je ne me plains pas, c'est exactement ce que je voulais. Juste bizarre.
donut
34

Première utilisation :set ff? pour déterminer le format de fichier de votre fichier.

Je suppose que cela pourrait être unix, alors le problème est que votre fichier a été créé en fileformat=dosajoutant "^ M ^ J" à la fin de la ligne mais lu avecflieformat=unix supprimant uniquement le "^ J" de la fin de la ligne, laissant le "^ M" là.

Entrez simplement :e ++ff=dosdans la ligne de commande Vim pour changer le format de votre fichier d'Unix en DOS. Cela devrait résoudre le problème. Sinon, :%s/\r//gdevrait vous aider.

chenxsan
la source
3
Je devais faire les deux. :e ++ff=dospuis :set ff=unixet:w
Max
29

Afin d'obtenir le caractère ^ M pour correspondre, j'ai dû le sélectionner visuellement, puis utiliser la commande Copier l'OS dans le presse-papiers pour le récupérer. Vous pouvez le tester en recherchant le personnage avant d'essayer la commande replace.

/^M

devrait sélectionner la première mauvaise ligne

:%s/^M/\r/g

remplacera tous les ^ M errants par des retours chariot.

Il s'agit de fonctions dans MacVim, qui est basé sur gvim 7.

ÉDITER:

Avoir à nouveau ce problème sur ma machine Windows 10, qui a Ubuntu pour Windows, et je pense que cela pose des problèmes de formatage de fichier pour vim. Dans ce cas, changer le ff en unix, mac ou dos n'a fait rien d'autre que de changer le ^ M en ^ J et vice-versa.

La solution dans ce cas:

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

La raison pour laquelle j'ai choisi cette voie est que je voulais m'assurer que je n'étais pas destructeur avec mon fichier. J'aurais pu, :%s/\r$//gmais cela aurait supprimé les retours de chariot tout de suite et aurait pu avoir des résultats inattendus. Au lieu de cela, nous convertissons le caractère CR singulier, ici un caractère ^ M, en un espace, puis supprimons tous les espaces à la fin des lignes (ce qui pour moi est un résultat souhaitable malgré tout)

Désolé d'avoir relancé une vieille question à laquelle il a été répondu depuis longtemps, mais il semblait y avoir une certaine confusion et j'ai pensé que j'aiderais à clarifier certaines choses car cela revient en tête dans les recherches Google.

Métagraphe
la source
1
appuyer sur ctrl-v ctrl-m peut également être utile pour insérer le caractère fwiw. mais le \ r est ce qui insère le bon retour chariot.
Métagraphe
1
Ceci est la bonne réponse. Comme indiqué ci-dessus, utilisez <ctrl-v> <ctrl-m> pour obtenir le littéral ^ M inséré dans la commande.
carlosayam
1
Je suis d'accord, même si je suis certain que si cela avait fonctionné pour moi au moment de la publication d'origine, je ne l'aurais pas posté. ;)
Métagraphe
22

Rien de tout cela ne fonctionnait pour moi, alors j'ai essayé ceci, qui a fonctionné:

type :%s/

presse CTRL-VCTRL-M

type //g

presse Enter

Donc, la commande globale dans Vim devrait ressembler à :%s/^M//g

Ce que cela fait: :%s(rechercher et remplacer) /^M/(ce symbole) /(sans caractères) g(globalement).

d -_- b
la source
Taper sur!! Fonctionne sur Mac.
shamail
17

^ M est récupéré par Ctrl+ Vet M, tout comme

s/^M//g
Andrew Sledge
la source
15

Sans avoir besoin d'utiliser Ctrl: :%s/\r$//

BHarman
la source
1
C'est aussi ainsi que je le fais. Je ne me souviens juste plus de la commande
pixel 67
Il s'agit de la méthode recommandée pour supprimer ces terminaisons.
Metagraphe
13

Chose simple qui a fonctionné pour moi

dos2unix   filename
Shahzeb Khan
la source
12

Je l'ai fait avec sed:

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

Freedom_Ben
la source
Êtes-vous sûr que cela fonctionne? Sur OSX: sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand
Oui, cela fonctionne (je l'utilise beaucoup), mais sur OSX si vous n'avez pas la version GNU de sed installée, cela peut ne pas fonctionner. La version de sed que Apple expédie par défaut est très différente (malheureusement) de la version GNU livrée sur toutes les distributions Linux. Consultez la réponse à cette question pour plus d'aide: stackoverflow.com/q/30003570/2062384
Freedom_Ben
Merci @Freedom_Ben. Il semble donc que cela fonctionne pour GNU sedmais pas pour BSD sed(comme on le trouve sur OSX). Quiconque corrige les sauts de ligne fonctionne probablement avec un mélange de systèmes d'exploitation, il est donc utile d'être clair sur le moment où la réponse fonctionnera.
Armand
10

Qu'en est-il juste: :%s/\r//g cela a totalement fonctionné pour moi.

Cela ne fait que nettoyer la fin de ligne de toutes les lignes, il supprime le ^ M et c'est tout.

tonatiuhnb
la source
9

Il existe de nombreuses autres réponses à cette question, mais la solution suivante me convient le mieux, car j'avais besoin d'une solution en ligne de commande:

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

Explication:

  • Sans charger de fichiers .vimrc, ouvrez myfile
  • Courir :e ++ff=dos pour forcer un rechargement de tout le fichier en tant que fins de ligne de dos.
  • Exécutez :w ++ff=unixpour écrire le fichier à l'aide des fins de ligne Unix
  • Quittez vim
Micah Smith
la source
3
Merci! cela a résolu mon problème et l'a trouvé utile à utiliser dans les scripts
Peddipaga
8

Ctrl+ Mminimise ma fenêtre, mais Ctrl+ Enterinsère en fait un ^Mcaractère. Je devais également être sûr de ne pas retirer la Ctrlclé entre les pressions.

La solution pour moi était donc:

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

<Ctrl-V><Ctrl-Enter>signifie appuyer et maintenir enfoncé Ctrl , appuyer et relâcher V, appuyer et relâcher Enter, puis relâcher Ctrl .

Si vous travaillez sur un fichier généré par Windows

La solution ci-dessus ajoutera une ligne supplémentaire entre les lignes existantes, car il y a déjà un invisible \raprès le ^M.

Pour éviter cela, vous souhaitez supprimer les ^Mcaractères sans les remplacer.

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

%signifie «dans ce tampon», ssignifie «remplacer», /signifie «(trouver) le modèle suivant», <Ctrl-V><Ctrl-Enter>fait référence aux touches à appuyer pour obtenir le ^Mcaractère (voir ci-dessus), //signifie «sans rien» (ou «avec le modèle»). entre ces deux barres obliques, qui est vide "), et gest un indicateur signifiant" globalement ", par opposition à la première occurrence d'une ligne.

CrannDarach
la source
7

Cela a fonctionné pour moi:

  1. Définir le format de fichier sur unix ( \nfin de ligne)
  2. enregistrez le fichier

Donc en vim:

:set ff=unix
:w
Stryker
la source
1
Celui-ci a fonctionné pour moi, alors que la réponse acceptée n'a pas fonctionné.
Marcello Romani
7

Dans mon cas,

Rien au-dessus n'a fonctionné, j'avais un fichier CSV copié sur la machine Linux à partir de mon mac et j'ai utilisé toutes les commandes ci-dessus mais rien n'y fait mais celui ci-dessous

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

J'avais un fichier dans lequel ^ M caractères étaient intercalés entre les lignes quelque chose comme ci-dessous

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
la source
5

Alternativement, il existe des utilitaires open-source appelés dos2unix et unix2dos qui font exactement cela. Sur un système Linux, ils sont probablement installés par défaut; pour un système Windows, vous pouvez les télécharger sur http://www.bastet.com/ entre autres.

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

où ^ M est tapé en appuyant simultanément sur les 3 touches, ctrl + v + m

Diamant bleu
la source
4

utilisez l'utilitaire dos2unix si le fichier a été créé sur Windows, utilisez l'utilitaire mac2unix si le fichier a été créé sur mac. :)

Ramesh
la source
je n'avais jamais entendu parler de mac2unix auparavant, j'aurais de nouveau voté si je le pouvais!
Kuf
Vive! c'est la voie à suivre!
Privé du
3

Utilisez l'une de ces commandes:

:%s/\r//g

Ou

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

Cela a fonctionné pour moi:

:% s/\r\n/\r
Changement de contexte
la source
1

Pour enregistrer les frappes , vous pouvez éviter de taper Ctrl+ VCtrl+ Men le plaçant dans un mappage. Ouvrez simplement un fichier contenant un caractère ^ M, tirez-le et collez-le dans une ligne comme celle-ci dans votre .vimrc:

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

Aucune de ces suggestions ne fonctionnait pour moi, ayant réussi à obtenir une charge de ^Msauts de ligne tout en travaillant avec vim et eclipse. Je soupçonne que j'ai rencontré un cas extérieur mais au cas où cela aiderait quelqu'un que j'ai fait.

:%s/.$//g

Et ça a réglé mon problème

rogermushroom
la source
Cela supprimera TOUT caractère à la fin d'une ligne. Si vous avez une ligne qui n'est pas, pour une raison quelconque, terminée par ^ M, vous supprimerez également ce caractère et ce serait inattendu. Cela ne devrait pas être le cas, mais si c'est le cas et que vous ne le savez pas, vous pouvez souiller votre fichier d'une manière très difficile à identifier.
Metagraphe
1
:g/^M/s// /g

Si vous tapez en ^Mutilisant Shift+6 Caps+Mil n'acceptera pas.

Vous devez taper ctrl+v ctrl+m.

Shravan Kumar
la source
1

^Mdonne des sauts de ligne indésirables. Pour gérer cela, nous pouvons utiliser la sedcommande comme suit:

sed 's/\r//g'
Manoj Kumar
la source
idk pourquoi cela a été rétrogradé à -1 ... parce qu'il utilise sed? vous pouvez faire la même substitution à l'intérieur de vim et cela devrait fonctionner
Metagrapher
1

Retirez-le simplement set binarydans votre .vimrc!

falcucci
la source
Dans un autre thread, "set binary" a été recommandé pour se débarrasser de l'insertion automatique de la nouvelle ligne.
dexter2305
1

Pour utiliser sedsur MacOS, procédez comme suit:

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

Explication: La $'STRING'syntaxe ici se rapporte au shell bash. Les Mac ne traitent pas \rcomme un caractère spécial. En citant la chaîne de commande dans, $''vous dites au shell de le remplacer \rpar le \rcaractère réel spécifié dans la norme ANSI-C.

Nitin Nain
la source
0

"Cette fonction conserve la liste des sauts

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
la source
Dans ce cas, quel est le problème avec l'utilisation de la commande native dos2unix de * NIX? linux.die.net/man/1/dos2unix
Métagraphe
0

J'ai passé un après-midi à me battre avec \ n ctrl-v 012 (les deux me fournissant null). & a travaillé sur ce fil jusqu'à ce que j'atteigne celui de métagraphe.

\r a bien fonctionné pour moi!

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

tourné quelque chose comme ça:

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,

en quelque chose comme ça:

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

La magie. Je suis profondément reconnaissant

user1997684
la source