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»?



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:



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


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.


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


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.


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.


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.


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


Taper sur!! Fonctionne sur Mac.
shamail


15

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


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


12

Je l'ai fait avec sed:

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


Ê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.


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

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.


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

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,

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.


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

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


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


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



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>

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


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.


1

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

sed 's/\r//g'

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!


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.


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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.