vim montre sur chaque ligne se terminant ^ M
Comment je fais pour remplacer ceci par un saut de ligne "normal"?
C'est la seule chose qui a fonctionné pour moi:
: e ++ ff = dos
Je l'ai trouvé à: http://vim.wikia.com/wiki/File_format
:%s/<Ctrl-V><Ctrl-M>/\r/g
Où <Ctrl-V><Ctrl-M>
signifie type Ctrl+V puis Ctrl+M.
:%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).
Sous Linux et Mac OS, les travaux suivants,
:%s/^V^M/^V^M/g
où ^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.
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).
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.
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.
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.
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).
Sans avoir besoin d'utiliser Ctrl: :%s/\r$//
Chose simple qui a fonctionné pour moi
dos2unix filename
J'ai fait ça avec sed:
sed -i -e 's/\r/\n/g' filename
^ M est récupéré par Ctrl+V et M, alors faites
s/^M//g
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.
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:
myfile
:e ++ff=dos
pour forcer le rechargement de la totalité du fichier en tant que fins de ligne DOS.:w ++ff=unix
pour écrire le fichier en utilisant des fins de ligne Unix.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
Où <Ctrl-V><Ctrl-Enter>
signifie maintenez la touche enfoncée Ctrl, appuie et relache V, appuie et relache Enter, puis relâchez Ctrl.
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
Où %
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.
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,
Cela a fonctionné pour moi:
\n
fin de ligne)Donc, dans vim:
:set ff=unix
:w
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
utilisez l'utilitaire dos2unix si le fichier a été créé sous Windows. Utilisez l'outil Mac2unix si le fichier a été créé sur mac. :)
Cela a fonctionné pour moi:
:% s/\r\n/\r
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
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>
Il suffit de supprimerset binary
dans votre fichier .vimrc!
^M
donne des sauts de ligne indésirables. Pour gérer cela, nous pouvons utiliser la commande sed
comme suit:
sed 's/\r//g'
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
: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
.
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
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.
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!
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.
"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()
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
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