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?
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?
Réponses:
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.
find . -name '*.txt' -print0 | xargs -null fromdos
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]
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!
Je fais ça sur Bash :
cat cr_stuffed.file | tr -d \r > no_more_crs.file
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.
Alt+d
. Parfois, alt est intercepté par le programme terminal, vous pouvez donc l'utiliser à la esc+d
place.
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\n
par \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
.
\r\n
à \n
puis à l' aide de recherche / remplacement est plus facile que de se souvenir que OS utilisations de fin de ligne. ;)
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.
CR LF
à l' LF
aide 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
).
1
Est-ce que le script est exécuté par awk? Un script est composé de condition { action }
. Dans ce cas, 1
est 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
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 .