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?

Bert Hekman
la source
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.

pjz
la source
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
Ludvig A. Norin
la source
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 :)


la source
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
Sylvain Defresne
la source
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.


la source
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.

mercutio
la source
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
14

à partir de: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix

[Échap]:% s / \ r $ //

Alex Gartrell
la source
+1 pour pointer vers le site officiel de doc. Pour toute personne utilisant le lien ci-dessus, consultez la section "Conversion du fichier actuel" sur cette page.
The Tin Man
Ce + vim -b <nom de fichier> a fonctionné comme un charme, merci, +1
Jan Molak
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)

Sparkida
la source
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
Venkataramesh Kommoju
la source
6

Les étapes suivantes peuvent convertir le format de fichier de dos en unix:

:e ++ff=dos  Edit file again, using dos file format ('fileformats' is ignored).[A 1]
:setlocal ff=unix    This buffer will use LF-only line endings when written.[A 2]
:w   Write buffer using unix (LF-only) line endings.

Référence: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix

ajitomatix
la source
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.

Dave Webb
la source
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
Dannid
la source
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.

Stefan Sjöberg
la source
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.

Rob Wells
la source
4

Vous pouvez utiliser:

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

ou dos2unix utility.

Christy Wald
la source
3

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

JayG
la source
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
Maerlyn
la source
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

Tallak Tveide
la source
2

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

CBuzatu
la source
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}";
}
dsm
la source
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 <[email protected]>
Albaro Pereyra
la source
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.

charge moyenne
la source
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
Thomas PABST
la source
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.

Santle Camilus
la source
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
user3379574
la source