Convertir les fins de ligne DOS en fins de ligne Linux dans vim


717

Si j'ouvre des fichiers que j'ai créés dans Windows, les lignes se terminent toutes par ^M.
Comment supprimer ces caractères d'un coup?


Si vous faites un hexdump -C badfileet voyez 0x0d 0x0a "\r\n"que c'est votre problème.
Yzmir Ramirez

Réponses:


1075

dos2unix est un utilitaire de ligne de commande qui le fera, ou le :%s/^M//gfera si vous utilisez Ctrl- v Ctrl- mpour saisir le ^ M, ou vous pouvez :set ff=unixet vim le fera pour vous.

Les documents sur le paramètre «format de fichier» sont ici , et le wiki vim a une page complète sur les conversions de fin de ligne .

Alternativement, si vous déplacez beaucoup de fichiers dans les deux sens, vous ne voudrez peut-être pas les convertir, mais plutôt pour le faire :set ff=dos, donc vim saura qu'il s'agit d'un fichier DOS et utilisera les conventions DOS pour les fins de ligne.


56
:%s/^M//gdevrait être :%s/\r//g, car ^Msignifie simplement "correspondre à la majuscule" M "au début de la ligne".
Bunyk

78
Pas si vous faites comme le dit la réponse et «utilisez ctrl-v ctrl-m pour saisir le ^ M».
pjz

2
crtl-v n'est pas bon, sur Windows, il colle le contenu du presse-papiers à la ligne de commande. La solution a :%s/\r//gfonctionné pour moi, cheers @Bunyk
roblogic

3
@ropata Ce que vous voulez sous Windows est ctrl-q .
ruffin

2
Je dois manquer quelque chose, car set ff=unixne fait rien. Peut-être qu'il convertit le fichier, mais tous les ^Mpersonnages sont toujours là.
felwithe

276

Modifiez les fins de ligne dans la vue:

:e ++ff=dos
:e ++ff=mac
:e ++ff=unix

Cela peut également être utilisé comme opération de sauvegarde (: w seul ne sauvegardera pas en utilisant les fins de ligne que vous voyez à l'écran):

:w ++ff=dos
:w ++ff=mac
:w ++ff=unix

Et vous pouvez l'utiliser à partir de la ligne de commande:

for file in *.cpp
do 
    vi +':w ++ff=unix' +':q' "$file"
done

4
Merci beaucoup. J'ai essayé vi + ': wq ++ ff = unix' <filepath> pour un paresseux comme moi.
a_secenthusiast

2
Ce devrait être la réponse la plus votée. :w +ff=unixest tellement plus agréable que la plupart des autres choses écrites ici, et le script bash est un bon bonus.
mkasberg

Les :ecommandes ne semblent rien faire sur mon installation de Windows vim. Ma vue montre toujours les ^Mcodes.
Grant Birchmeier

160

J'utilise généralement

:%s/\r/\r/g

ce qui semble un peu étrange, mais fonctionne à cause de la façon dont vim correspond aux sauts de ligne. Je trouve aussi plus facile de m'en souvenir :)


9
Cela fonctionne de manière cohérente sur toutes les plateformes. La meilleure réponse ici.
thebigjc

4
Je n'ai jamais eu de problème :set ff=unixauparavant, mais le fichier que j'ai ouvert aujourd'hui a dû être particulièrement étrange. Vim a dit que c'était déjà le cas fileformat=unixmais que toutes les fins de ligne l'étaient ^M. Cette solution a fonctionné pour moi.
Chris B

15
Cette solution ajoute des lignes supplémentaires indésirables pour moi, doublant le nombre de lignes dans le fichier. :%s/\r//gfonctionne plutôt pour moi.
Victor Zamanian

3
Victor, vos fichiers ont probablement des terminaisons \ r \ n. le \ r n'est pas lu comme une nouvelle ligne mais le \ n l'est. Dans les fichiers que je rencontre sont \ r et vous devez ajouter un caractère de nouvelle ligne.
Joeyjoejoejr

2
@ VictorZamanian :%s/\r//gest la seule solution à usage général - en particulier pour les fichiers en mode mixte contenant un mélange hétérogène de nouvelles lignes de style DOS et UNIX. Les solutions canoniques (par exemple :set ff=unix, :e ++ff=unix) prennent toutes les lignes des extrémités de tampon courant dans le même style de saut de ligne. Parfois, ils le font; parfois non. Cue sadface.
Cecil Curry

97

Je préfère utiliser la commande suivante:

:set fileformat=unix

Vous pouvez également utiliser macou dospour convertir respectivement votre fichier en macintosh ou convention de fichiers MS-DOS / MS-Windows. Et cela ne fait rien si le fichier est déjà au format correct.

Pour plus d'informations, consultez l'aide de vim:

:help fileformat

1
Cette commande ne semble rien faire sur mon Windows vim. Ma vue contient toujours des ^Mcaractères.
Grant Birchmeier

L'ajout set fileformat=unixà mon fichier .vimrc a fonctionné.
Joey Allen

20

:set fileformat=unix pour convertir de dos à unix.


1
Cela a en fait résolu le problème pour moi. Je n'ai pas pu trouver ces personnages lors de la recherche.
Captain Insaneo

20
:%s/\r+//g

Dans Vim, cela supprime tous les retours chariot et ne laisse que des retours à la ligne.


2
Pour une raison quelconque, ci-dessus n'a pas fonctionné pour moi sous windows gvim. Mais une fois changé, :%s/\r//gil fonctionnait comme un charme.
soltysh

1
@soltysh:% s / \ r \ + $ // g
thinker3


10

Convertir un répertoire de fichiers de dos vers Unix

En utilisant la ligne de commande et sed, recherchez tous les fichiers dans le répertoire courant avec l'extension ".ext" et supprimez tous les "^ M"

@ https://gist.github.com/sparkida/7773170

find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;

aussi, comme mentionné ci-dessus ^ M = Ctrl+V+ Ctrl+M(ne vous contentez pas de taper le symbole caret "^" et M)


9

dos2unix peut modifier directement le contenu du fichier.

Vous pouvez directement l'utiliser sur le fichier, sans avoir besoin de redirection de fichier temporaire.

dos2unix input.txt input.txt

Ce qui précède utilise le clavier américain supposé. Utilisez l' -option 437 pour utiliser le clavier britannique.

dos2unix -437 input.txt input.txt



6

Avec la commande suivante:

:%s/^M$//g 

Obtenez le ^Mpour apparaître le type CtrlValors CtrlM. CtrlVdit à Vim de prendre le prochain caractère entré littéralement.


6

Le commentaire à propos de l'apparition du ^ M est ce qui a fonctionné pour moi. Le simple fait de taper "^ M" dans mon vi n'a rien (introuvable). Le CTRL+ V CTRL+M séquence a parfaitement fait.

Ma commande de substitution de travail était

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

et ça ressemblait à ça sur mon écran:

:%s/^M/\r/g

4
Vous pouvez utiliser à la :%splace du :1,$s. %est un raccourci pour 1,$.
The Tin Man

5

J'ai trouvé un moyen très simple: Ouvrez le fichier avec nano: nano file.txt

Appuyez sur CTRL+ Opour enregistrer, mais avant d'appuyer sur Enter, appuyez sur:ALT + Dpour basculer entre les fins de ligne DOS et Unix / Linux, ou: ALT+ Mpour basculer entre les fins de ligne Mac et Unix / Linux, puis appuyez sur Enterpour enregistrer et CTRL+ Xpour quitter.


fait cela sur un serveur linux, le fichier avait des ^Mfins. enregistrer sous dos pour conserver, enregistrer sous linux pour supprimer. peut vérifier en utilisantcat -v
HattrickNZ

Cette question concerne vim, pas nano.
Grant Birchmeier

5
:g/Ctrl-v Ctrl-m/s///

CtrlMest le caractère \r, ou retour chariot, ajouté par les fins de ligne DOS. CtrlVindique à vim d'insérer un CtrlMcaractère littéral sur la ligne de commande.

Pris dans son ensemble, cette commande remplace tout \rpar rien, en les supprimant de la fin des lignes.


4

Vous pouvez utiliser:

vim somefile.txt +"%s/\r/\r/g" +wq

ou dos2unix utility.


3

Vous pouvez utiliser la commande suivante:
:%s/^V^M//g
où le '^' signifie utiliser la CTRLclé.


2

la commande ci-dessous est utilisée pour reformater tous les fichiers .sh dans le répertoire actuel, je l'ai testé sur mon système d'exploitation Fedora.

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done

2

Dans vim, saisissez:

:w !dos2unix %

Cela dirigera le contenu de votre tampon actuel vers la commande dos2unix et écrira les résultats sur le contenu actuel. Vim vous demandera de recharger le fichier après


2

Pour exécuter directement dans la console Linux: vim file.txt +"set ff=unix" +wq


1

Il y a généralement un dos2unix commande que vous pouvez utiliser pour cela, assurez-vous simplement de lire le manuel car les versions GNU et BSD diffèrent sur la façon dont elles traitent les arguments.

Version BSD:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

Version GNU:

dos2unix $FILENAME

Alternativement, vous pouvez créer la vôtre dos2unixavec l'une des réponses proposées ici, par exemple:

function dos2unix(){
    [ "${!}" ] && [ -f "{$1}" ] || return 1;

    { echo ':set ff=unix';
      echo ':wq';
    } | vim "${1}";
}

1

Je savais que j'avais vu ça quelque part. Voici l'astuce de connexion à FreeBSD:

Besoin de supprimer tous ces caractères ^ M d'un fichier DOS? Essayer

tr -d \\r < dosfile > newfile
    -- Originally by Dru <genesis@istar.ca>

0

Bien que ce sujet soit très ancien, j'aimerais mettre un autre truc de Wikia:

%s/\r\+$//g

qui remplissent trouver tous les signes de retour chariot (un et plusieurs représentants) jusqu'à la fin de la ligne et supprimer, \nrestera donc à eol.


0

C'est mon chemin. J'ai ouvert un fichier dans dos EOL et quand j'enregistre le fichier qui sera automatiquement converti en unix EOL

autocmd BufWrite * :set ff=unix

0

si vous créez un fichier dans NotePad ou NotePad ++ dans Windows et que vous le portez à Linux et l'ouvrez par vim, vous verrez ^ M à la fin de chaque ligne. Pour supprimer cela,

Sur votre terminal Linux, saisissez

dos2unix filename.ext

Cela fera la magie requise.


0

Je voulais des nouvelles lignes à la place des ^ M. Perl à la rescousse:

perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt

Ou pour écrire à stdout:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
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.