Comment convertir le saut de ligne ^m en saut de ligne 'normal' dans un fichier ouvert dans vim?
Vim s'affiche sur chaque ligne se terminant ^M
Comment je fais pour remplacer cela par un saut de ligne 'normal'?
30 réponses
C'est la seule chose qui a fonctionné pour moi:
: e ++ff = dos
Trouvé à: http://vim.wikia.com/wiki/File_format
Commande
:%s/<Ctrl-V><Ctrl-M>/\r/g
Où <Ctrl-V><Ctrl-M>
signifie que le type Ctrl+V, puis 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 caractère spécial)
/\r/
Avec une nouvelle ligne (\r
)
g
Et le faire globalement (pas seulement la première occurrence sur ligne).
Sous Linux et Mac OS, les travaux suivants,
:%s/^V^M/^V^M/g
Où ^V^M
signifie que le type Ctrl+V, puis Ctrl+M.
Remarque: sous Windows, vous voudrez probablement utiliser ^Q
au lieu de ^V
, puisque par défaut ^V
est mappé à coller du texte.
Dans vim
, regardez 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).
Un fichier que j'avais créé avec BBEdit vu dans MacVim affichait un tas de ^M
retourne au lieu de régulières. La chaîne suivante replace 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'un nouveau \r pour s'afficher correctement. Je serais intéressé de connaître la mécanique sous-jacente de pourquoi cela fonctionne.
Tout d'Abord, utilisez :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
ajoutant "^M^J" à la fin de la ligne mais LU avec flieformat=unix
ne supprimant que le "^J" de la fin de la ligne, laissant le "^M" là.
Il suffit d'entrer :e ++ff=dos
dans la ligne de commande Vim pour changer le format de votre fichier d'unix à dos. Il devrait résoudre le problème. Sinon, :%s/\r//g
devrait vous aider.
Afin de faire correspondre le caractère ^M, j'ai dû le sélectionner visuellement, puis utiliser la commande Copier dans le presse-papiers du système d'exploitation pour le récupérer. Vous pouvez le tester en effectuant une recherche du caractère 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.
C'est comme fonctions dans MacVim, qui est 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 provoque des problèmes de format de fichier pour vim. Dans ce cas, changer le ff en unix, mac ou dos n'a rien d'autre que de changer le ^M en ^J et inversement.
La solution dans ce cas:
:%s/\r$/ /g
:%s/ $//g
La raison pour laquelle je suis allé dans cette voie est parce que je voulais m'assurer que j'étais non destructif avec mon fichier. J'aurais pu :%s/\r$//g
mais cela aurait supprimé les retours chariot dès la sortie, 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 indépendamment)
Désolé d'avoir ravivé une vieille question à laquelle on a répondu depuis longtemps, mais il semblait y avoir une certaine confusion et j'ai pensé que j'aiderais à éclaircir une partie de cela car cela arrive très haut dans les recherches google.
Aucun de ceux-ci n'a fonctionné pour moi, alors j'ai essayé ceci, qui a fonctionné:
De Type :%s/
Appuyez sur CTRL-VCTRL-M
De Type //g
Appuyez Sur Entrer
Ainsi, la commande globale dans Vim shoud ressemble à :%s/^M//g
Ce que cela fait: :%s
(Trouver et remplacer) /^M/
(ce symbole) /
(sans caractères) g
(globalement).
Qu'en est-il juste:
:%s/\r//g
Qui a totalement fonctionné pour moi.
Ce que cela fait est juste pour nettoyer la fin de la ligne de toutes les lignes, il supprime le ^M et c'est tout.
Ctrl+M réduit ma fenêtre, mais Ctrl+Saisissez réellement insère un ^M
caractères. Je devais aussi être sûr de ne pas enlever la touche Ctrl entre les presses.
Donc la solution pour moi était:
:%s/<Ctrl-V><Ctrl-Enter>/\r/g
Où <Ctrl-V><Ctrl-Enter>
moyens de appuyez et maintenez Ctrl, appuyez sur et relâchez - V, appuyez sur et relâchez - Entrer, et 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 y a 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
Où %
signifie "dans ce tampon," s
signifie "substitut," /
signifie "(trouver) le schéma suivant," <Ctrl-V><Ctrl-Enter>
désigne les touches à presser pour obtenir le ^M
caractère (voir ci-dessus), //
signifie "rien" (ou, "avec le motif entre ces deux barres obliques, qui est vide"), et g
est un flag signifiant "globalement", par opposition à la première occurrence d'une ligne.
Il y a beaucoup d'autres réponses à cette question, mais quand même, ce qui suit fonctionne le mieux pour moi, car j'avais besoin d'une solution de ligne de commande:
vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile
Explication:
- sans en charger .fichiers vimrc, ouvrir
myfile
- exécutez
:e ++ff=dos
pour forcer un rechargement du fichier entier en tant que terminaisons de ligne dos. - exécutez
:w ++ff=unix
pour écrire le fichier en utilisant les terminaisons de ligne unix - Quitter vim
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é mais celui ci-dessous
tr "\015" "\n" < inputfile > outputfile
J'avais un fichier dans lequel les caractères ^m étaient pris en sandwich 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,
Cela a fonctionné pour moi:
- définissez le format de fichier sur unix (
\n
fin de ligne) - enregistrez le fichier
Donc dans vim:
:set ff=unix
:w
Alternativement, il existe des utilitaires open-source appelés dos2unix et unix2dos disponibles qui font 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 depuis http://www.bastet.com/ entre autres.
sed s/^M//g file1.txt > file2.txt
Où ^M est tapé en appuyant simultanément sur les 3 touches, ctrl + v + m
Utilisez l'utilitaire dos2unix si le fichier a été créé sous windows, utilisez l'utilitaire mac2unix si le fichier a été créé sur mac. :)
À enregistrer les frappes de touches, vous pouvez éviter de taper Ctrl+VCtrl+M de la placer 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 .vimrc:
nnoremap <Leader>d :%s/^M//g<CR>
Aucune de ces suggestions ne fonctionnait pour moi ayant réussi à obtenir une charge de ^M
sauts 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 il a réglé mon problème
:g/^M/s// /g
Si vous tapez ^M
en utilisant Shift+6 Caps+M
Il n'acceptera pas.
, Vous devez taper ctrl+v ctrl+m
.
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
^M
donne des sauts de ligne indésirables. Pour gérer cela, nous pouvons utiliser la commande sed
comme suit:
sed 's/\r//g'
" 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()
J'ai passé un après-midi à lutter avec \n ctrl-v 012 (les deux me fournissent null). & a travaillé à travers ce fil jusqu'à ce que j'atteigne celui de metagraph.
\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-commune: i386 (1.0.22-7.3,
Dans quelque chose comme ceci:
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)
Magie. Je suis profondément reconnaissant
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!