web-dev-qa-db-fra.com

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

vim montre sur chaque ligne se terminant ^ M

Comment je fais pour remplacer ceci par un saut de ligne "normal"?

449
ByteNirvana

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

: e ++ ff = dos

Je l'ai trouvé à: http://vim.wikia.com/wiki/File_format

99
Pam

Commander

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

<Ctrl-V><Ctrl-M> signifie type Ctrl+V puis Ctrl+M.

Explication

:%s

substitute,% = toutes les lignes

<Ctrl-V><Ctrl-M>

^ M caractères (Ctrl-V est une manière de Vim d'écrire le caractère Ctrl ^ et Ctrl-M écrit le M après l'expression régulière, ce qui donne ^ M caractère spécial)

/\r/

avec une nouvelle ligne (\r)

g

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

551

Sous Linux et Mac OS, les travaux suivants,

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

^V^M signifie type Ctrl+V, puis Ctrl+M.

Remarque: sous Windows, vous souhaiterez probablement utiliser ^Q au lieu de ^V, car par défaut ^V est mappé pour coller du texte.

412
Paul Tomblin

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

:set filetype=unix

:set fileformat=unix

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

180

Un fichier que j'avais créé avec BBEdit et visible dans MacVim affichait un ensemble de retours à la ligne ^M au lieu de retours normaux. La chaîne suivante remplace le problème résolu - espérons que cela vous aidera:

:%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’un nouveau caractère pour s’afficher correctement. Je serais intéressé de connaître les mécanismes sous-jacents de la raison pour laquelle cela fonctionne.

101
netpoetica

Commencez par utiliser :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éé avec fileformat=dos en ajoutant "^ M ^ J" à la fin de la ligne mais lu avec flieformat=unix en supprimant seulement le "^ J" de la fin de la ligne, en laissant le "^ M" Là. 

Il vous suffit de saisir :e ++ff=dos dans la ligne de commande Vim pour modifier le format de votre fichier de Unix à DOS. Cela devrait résoudre le problème. Sinon, :%s/\r//g devrait vous aider.

34
chenxsan

afin de faire correspondre le caractère ^ M, je devais le sélectionner visuellement, puis utiliser la commande Copier vers Presse-papiers du système d'exploitation pour le récupérer. Vous pouvez le tester en recherchant le personnage avant d'essayer la commande de remplacement.

/^M

devrait sélectionner la première mauvaise ligne

:%s/^M/\r/g

remplacera tous les errants ^ M par des retours à la ligne.

C’est comme les fonctions de MacVim, basé sur gvim 7.

MODIFIER:

Avoir ce problème à nouveau sur ma machine Windows 10, qui a Ubuntu pour Windows, et je pense que cela cause des problèmes de format de fichier pour vim. Dans ce cas, changer le ff en unix, mac ou DOS n'a fait que changer le ^ M en ^ J et inversement.

La solution dans ce cas:

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

J'ai choisi cette voie parce que je voulais m'assurer que mon dossier était non destructif. J'aurais pu avoir :%s/\r$//g, mais cela aurait supprimé les retours à la ligne 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 nous supprimons tous les espaces à la fin des lignes (ce qui pour moi est un résultat souhaitable, peu importe).

Désolé de faire revivre une vieille question à laquelle on a répondu depuis longtemps, mais il semblait y avoir une certaine confusion et je pensais que je pourrais aider à éclaircir une partie de cette question car elle est en train de monter en haut dans les recherches Google.

28
Metagrapher

Aucun de ceux-ci n'a fonctionné pour moi, alors j'ai essayé ceci, qui a fonctionné:

tapez :%s/

presse CTRL-VCTRL-M

tapez //g

presse Enter

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

Signification: :%s (rechercher et remplacer) /^M/ (ce symbole) / (sans caractère) g (globalement).

22
d-_-b

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

14
Brian Harman

Chose simple qui a fonctionné pour moi 

dos2unix   filename
12
Shahzeb

J'ai fait ça avec sed:

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

12
Freedom_Ben

^ M est récupéré par Ctrl+V et M, alors faites

s/^M//g
12
Andrew Sledge

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, cela enlève le ^ M et c'est tout.

9
tonatiuhnb

Il existe de nombreuses autres réponses à cette question, mais néanmoins, ce qui suit fonctionne le mieux pour moi, 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 aucun fichier .vimrc, ouvrez myfile
  • Exécutez :e ++ff=dos pour forcer le rechargement de la totalité du fichier en tant que fins de ligne DOS.
  • Exécutez :w ++ff=unix pour écrire le fichier en utilisant des fins de ligne Unix.
  • Quitte vim
8
Micah Smith

Ctrl+M minimise ma fenêtre, mais Ctrl+Enter insère en fait un caractère ^M. Je devais aussi être sûr de ne pas soulever le Ctrl touche entre les appuis.

La solution pour moi était donc:

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

<Ctrl-V><Ctrl-Enter> signifie maintenez la touche enfoncée Ctrl, appuie et relache V, appuie et relache Enter, puis relâchez 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 existe déjà un \r invisible après le ^M.

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

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

% signifie "dans ce tampon," s signifie "substitut", / signifie "(trouvez) le modèle suivant," <Ctrl-V><Ctrl-Enter> fait référence aux touches à utiliser pour obtenir le caractère ^M (voir ci-dessus), // signifie "sans rien" ( ou, "avec le motif vide entre ces deux barres obliques,"), et g est un flag qui signifie "globalement", par opposition à la première occurrence d'une ligne.

8
CrannDarach

Dans mon cas, 

Rien ci-dessus n'a fonctionné, j'ai eu un fichier CSV copié sur une machine Linux à partir de mon mac et j'ai utilisé toutes les commandes ci-dessus, mais rien n'a aidé sauf celui ci-dessous

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

J'avais un fichier dans lequel ^ M caractères étaient répartis entre les lignes, 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,
7
Vishwanath gowda k

Cela a fonctionné pour moi:

  1. Définir le format de fichier sur unix (\n fin de ligne)
  2. sauvegarder le fichier

Donc, dans vim:

:set ff=unix
:w
6
Stryker

Alternativement, il existe des utilitaires open-source appelés dos2unix et unix2dos disponibles 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 à partir de http://www.bastet.com/ entre autres.

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

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

5
Blue Diamond

utilisez l'utilitaire dos2unix si le fichier a été créé sous Windows. Utilisez l'outil Mac2unix si le fichier a été créé sur mac. :)

4
Ramesh

Cela a fonctionné pour moi:

:% s/\r\n/\r
2
ContextSwitch

Je sais que c'est peut-être trop vieux, mais j'espère que quelqu'un pourra trouver cela utile.

Utilisez l'une de ces commandes:

:%s/\r//g

Ou

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

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

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

Il suffit de supprimerset binary dans votre fichier .vimrc!

1
Alex Falcucci

^M donne des sauts de ligne indésirables. Pour gérer cela, nous pouvons utiliser la commande sed comme suit:

sed 's/\r//g'
1
Manoj Kumar

Aucune de ces suggestions ne fonctionnait pour moi car j'ai réussi à avoir une charge de sauts de ligne ^M 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 je ferais.

:%s/.$//g

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

1
rogermushroom
:g/^M/s// /g

Si vous tapez ^M en utilisant Shift+6 Caps+M, il ne sera pas accepté.

Vous devez taper ctrl+v ctrl+m.

1
Shravan Kumar

Sur une console série, toutes les solutions vi et sed ne fonctionnaient pas pour moi. J'ai dû:

cat inputfilename | tr -d '\r' > outputfilename
0
robsn

Aucun de ce qui précède n'a fonctionné pour moi. (substitution sur\r, ^ M, ctrl-v-ctrl-m) J'ai utilisé copier/coller pour coller mon texte dans un nouveau fichier. 

Si vous avez des macros qui interfèrent, vous pouvez essayer :set paste avant l'opération de collage et :set nopaste après.

0
statueofmike

Ou au lieu d'utiliser vim, vous pouvez simplement corriger les sauts de ligne en utilisant cette commande

fromdos <filename.txt>

J'espère que ça aide!

0
bsmoo

Pour utiliser sed sur MacOS, procédez comme suit:

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

Explication: La syntaxe $'STRING' concerne le bash Shell. Les Mac ne traitent pas \r en tant que caractère spécial. En citant la chaîne de commande dans $'', vous indiquez au shell de remplacer \r par le caractère \r spécifié dans la norme ANSI-C.

0
Nitin Nain

"Cette fonction préserve 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()
0
SergioAraujo

Dans vim, utilisez la commande:

:% s/\ r\n/\ r/g

Où vous voulez rechercher et remplacer:

\ r\n

dans

\ r

et le

/g

est pour global

Notez que ceci est identique à la réponse de @ContextSwitch mais avec l'indicateur gobal

0
markyk

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

\r a bien fonctionné pour moi! 

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

tourné quelque chose comme ceci:

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,

dans 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

0
user1997684