vim apparaît sur chaque ligne se terminant par ^ M
Comment puis-je remplacer cela par un saut de ligne «normal»?
vim apparaît sur chaque ligne se terminant par ^ M
Comment puis-je remplacer cela par un saut de ligne «normal»?
Réponses:
C'est la seule chose qui a fonctionné pour moi:
: e ++ ff = dos
Trouvé sur: http://vim.wikia.com/wiki/File_format
:e ++ff=dossuivi de :set ff=unixconvertira les terminaisons dans un format sain.
:%s/<Ctrl-V><Ctrl-M>/\r/g
Où <Ctrl-V><Ctrl-M>signifie taper Ctrl+ Vpuis Ctrl+ M.
:%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).
:%s/<Ctrl-V><Ctrl-M>/\r/g(où \ r remplace le ^ M par une nouvelle ligne).
Sous Linux et Mac OS, les travaux suivants,
:%s/^V^M/^V^M/g
où ^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.
%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.
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).
set ff=unixcomme un petit raccourci de la même manière ftqu'un raccourci pourfiletype
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.
\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.
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.
:e ++ff=dospuis :set ff=unixet:w
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.
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).
^ M est récupéré par Ctrl+ Vet M, tout comme
s/^M//g
Sans avoir besoin d'utiliser Ctrl:
:%s/\r$//
Chose simple qui a fonctionné pour moi
dos2unix filename
Je l'ai fait avec sed:
sed -i -e 's/\r/\n/g' filename
sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
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.
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.
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:
myfile:e ++ff=dos pour forcer un rechargement de tout le fichier en tant que fins de ligne de dos.:w ++ff=unixpour écrire le fichier à l'aide des fins de ligne UnixCtrl+ 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
Où <Ctrl-V><Ctrl-Enter>signifie appuyer et maintenir enfoncé Ctrl , appuyer et relâcher V, appuyer et relâcher Enter, puis relâcher Ctrl .
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
Où %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.
Cela a fonctionné pour moi:
\nfin de ligne)Donc en vim:
:set ff=unix
:w
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,
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.
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'une de ces commandes:
:%s/\r//g
Ou
:%s/\r\(\n\)/\1/g
Cela a fonctionné pour moi:
:% s/\r\n/\r
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
:g/^M/s// /g
Si vous tapez en ^Mutilisant Shift+6 Caps+Mil n'acceptera pas.
Vous devez taper ctrl+v ctrl+m.
^Mdonne des sauts de ligne indésirables. Pour gérer cela, nous pouvons utiliser la sedcommande comme suit:
sed 's/\r//g'
Retirez-le simplement set binarydans votre .vimrc!
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.
"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 à 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