Convertir les CRLF en sauts de ligne sous Linux

34

Quel est le meilleur moyen de convertir les fichiers CRLF en sauts de ligne dans des fichiers sous Linux?

J'ai vu des commandes sed , mais y a-t-il quelque chose de plus simple?

JoelFan
la source
4
Dupe: superuser.com/questions/38744/… . Le lien fourni dans la réponse acceptée couvre les options dos2unix, perl et vi, entre autres.
Nagul
2
Cela a déjà de meilleures réponses cependant (donc si l'une d'elles doit être fermée, elle devrait probablement l'être)
Jonik

Réponses:

40

Utilisez cette commande:

fromdos yourtextfile

L'inverse:

todos yourtextfile

Ces commandes se trouvent dans le paquet tofrodos (sur les distributions les plus récentes), qui fournit également les deux wrappers unix2dos et dos2unix qui imitent les anciens outils unix du même nom.

avelldiroll
la source
2
+1 Bien plus utile que la réponse "Utilisez dos2unix" actuellement votée par le plus haut vote.
Jonik
1
Oui, même je vote celui-ci. Le mien était plutôt une suggestion de conduite.
Ryan C. Thompson
Je donnerais un bonus supplémentaire si vous dites comment le rendre récursif. Fonctionne actuellement uniquement avec des caractères génériques.
sorin
2
@SorinSbarnea: quelque chose commefind . -name '*.txt' -print0 | xargs -null fromdos
bstpierre
@ Jonik, qu'est-ce qui le rend "beaucoup plus utile"? Sérieuse question
andrewtweber le
24

Utilisez dos2unix.

dos2unix - Convertisseur de format de fichier texte DOS / MAC vers UNIX

dos2unix  [options] [-c convmode] [-o file ...] [-n infile outfile ...]

Options:
          [-hkqV] [--help] [--keepdate] [--quiet] [--version]
Ryan C. Thompson
la source
2
et unix2dos pour l'inverse.
Quack Quichotte
Quack, tu me suis? Non pas que je ne l'apprécie pas, avec tous les votes positifs.
Ryan C. Thompson
1
mec, je suis ~ charlatan. prononcez "~" comme "non". :) mais non, je ne vous suis pas, mais je semble vous rencontrer fréquemment.
Quack Quichotte
1
Pensez à expliquer comment obtenir cet utilitaire pour votre système Linux. Du moins sur Ubuntu, il n'est pas installé par défaut (mais en installant le paquet tofrodos, vous obtenez quelque chose de très similaire: packages.ubuntu.com/jaunty/tofrodos ).
Jonik
20

Je préfère le perl :

perl -lne 's/\r//g; print' winfile.txt > unixfile.txt

Mais cela convient bien à mes utilisations et il m'est très facile de m'en souvenir. Tous les systèmes ne disposent pas d'une commande dos2unix, mais la plupart des travaux sur lesquels je travaille ont un interpréteur Perl.

Un autre est recodé , un puissant substitut pour dos2unix et iconv; il est disponible dans le paquet "recode" dans les dépôts Debian:

recode ibmpc..lat1 winfile.txt   # dos2unix
recode lat1..ibmpc unixfile.txt  # unix2dos

Pour les fans de awk :

awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt

... et sed :

sed 's/\r$//' winfile.txt > unixfile.txt

Et maintenant, seulement un peu moins compliqué que de supprimer les CR à la main dans un éditeur hexadécimal, directement d' un de nos amis de stackoverflow.com , utilisables avec l' interpréteur de boeuf (situé sur le référentiel Debian de votre sympathique quartier),

dos2unix dans le brainfuck !

,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.

grand merci à jk pour avoir perdu une heure de sa vie à écrire ça!

Quack Quack
la source
1
(utilisation inutile de chat et) perl est aussi compliqué que sed ... vous ne répondez donc pas vraiment à la question, mais collectez plutôt la réputation :)
akira
2
"Le meilleur moyen" est subjectif. cela fonctionne mieux pour moi (je suis beaucoup plus à l'aise avec perl que sed). Je n'avais pas promis que ça marcherait mieux pour vous.
Quack Quichotte
@akira: une question peut avoir plusieurs réponses valides. J'utilise aussi cette méthode occasionnellement, principalement en combinaison avec d'autres modifications, ce qui en fait une réponse valable. mais "utiliser dos2unix" est certainement la réponse la plus pratique dans la plupart des situations. Donc, je pense que les cotes sont bonnes.
Reinierpost
@akira: si vous le trouvez plus simple, postez-le comme une réponse et éclairez le reste d'entre nous.
Quack Quichotte
@ ~ charlatan: voilà le problème: ce n'est pas plus simple. C'est la même chose pour votre réponse Perl. u2d ou fromdos / todos sont les bonnes réponses car elles sont plus simples que tout élément exprimé dans un autre langage de programmation.
Akira
9

Je fais ça sur Bash :

cat cr_stuffed.file | tr -d \r > no_more_crs.file
JustJeff
la source
agréable. J'ai vu une autre mention de tr plus tôt aujourd'hui. ce n'est pas un programme qui est mentionné très souvent, n'est-ce pas?
Quack Quichotte
7

Je pense que vous pouvez aussi utiliser tr(bien que je n’ai pas de fichiers de format amusant à essayer):

tr -d '\r' < file1 > file2
garenne
la source
4

Dans vi ou Vim :

:%s/^V^M//g
fpmurphy
la source
4

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

appuyez sur Ctrl + O pour enregistrer, mais avant d’appuyer sur Entrée, appuyez sur: Alt + D pour basculer entre les fins de ligne DOS et Unix / Linux, ou: Alt + M pour basculer entre les fins de ligne Mac et Unix / Linux, puis appuyez sur Entrée pour enregistrer les modifications. Ctrl + X pour quitter.

Stefan Sjöberg
la source
1
Pourriez-vous modifier votre réponse afin de préciser les paramètres de bascule qui reproduiront le comportement demandé par l'OP?
Burgi
Le PO veut désactiver les fins de ligne DOS, donc Alt+d. Parfois, alt est intercepté par le programme terminal, vous pouvez donc l'utiliser à la esc+dplace.
spin
1
De nombreux raccourcis nano fonctionnent également lorsque vous appuyez sur Shift, ce qui empêche souvent une interception de terminal. Le mode 'Alt-Shift-D' fonctionne également.
mwfearnley
3

Je préfère Vim et :set fileformat=unix. Bien que ce ne soit pas le plus rapide, il me donne un aperçu. Ceci est particulièrement utile dans le cas d'un fichier à terminaisons mixtes.

opello
la source
1

Si vous voulez une méthode graphique, essayez l’ éditeur de texte Kate (d’autres éditeurs de texte avancés peuvent également le gérer). Ouvrez la Recherche / Remplacer dialogue ( Ctrl+ R), et remplacer \r\npar \n. (NB: vous devez choisir "Expression régulière" dans le menu déroulant et désélectionner "Sélection uniquement" dans les options.)

EDIT: Ou, si vous voulez simplement convertir au format Unix, utilisez l'option de menu Tools> End of Line> Unix.

Chèvre mécontente
la source
Il existe des éditeurs de texte, tels que jEdit, qui peuvent effectuer ces transformations automatiquement - indiquez-le simplement si vous souhaitez des séparateurs de ligne Unix, Windows ou Mac.
Jonik
En fait, KATE peut également le faire via le menu Outils> Fin de ligne . Peut - être que je l' aurais pensé plus latéralement que de répondre à la question exactement comme il a été formulée - mais si vous savez que vous voulez spécifiquement convertir \r\nà \npuis à l' aide de recherche / remplacement est plus facile que de se souvenir que OS utilisations de fin de ligne. ;)
DisgruntledGoat
1

Collez ceci dans le script Python dos2unix.py .

#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys

if len(sys.argv[1:]) != 2:
  sys.exit(__doc__)

content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
  content = infile.read()
with open(sys.argv[2], 'wb') as output:
  for line in content.splitlines():
    outsize += len(line) + 1
    output.write(line + '\n')

print("Done. Saved %s bytes." % (len(content)-outsize))

Devrait fonctionner sur n'importe quelle plate-forme sur laquelle Python est installé. Domaine public.

Anatoly Techtonik
la source
1

CR LFà l' LFaide awk :

awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename

Exemple d'utilisation:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C

Explication:

-v RS='\r?\n'ensembles RS variables ( entrée R ECORD de la eparator) de à \r?\n, ce qui signifie entrée sont lues ligne par ligne , séparés par LF ( \n) qui peut ( ?) est précédée par CR ( \r).

1Est-ce que le script est exécuté par awk? Un script est composé de condition { action }. Dans ce cas, 1est la condition qui est évaluée à true. L'action est omise, donc l'action par défaut est exécutée, ce qui signifie que vous imprimez la ligne en cours (qui pourrait également être écrite sous la forme {print $0}ou simplement {print}).


LFà CR LF: permet de définir la variable ORS( o utput r ECORD s eparator) pour modifier les extrémités de la ligne de la sortie. Exemple:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C
Martin
la source
0

J'ai utilisé ce script pour les fichiers nécessaires au transfert d'urgence de fichiers d'un système Windows vers un système Unix.

 find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix

find . -type f

Recherche tous les fichiers, de manière récursive, dans le répertoire dans lequel vous exécutez la commande.

xargs file

Transmettez-le au programme de fichiers pour obtenir une analyse du fichier.

grep CRLF

Nous voulons seulement la sortie du fichier qui montre CRLF.

cut -d: -f1

Obtenez la sortie à la couleur. jeter le reste. Nous devrions seulement avoir un nom de fichier maintenant

xargs dos2unix

Passez le nom du fichier au programme dos2unix en utilisant xargs .

Tschallacka
la source