Comment puis-je par programme (c'est-à-dire ne pas utiliser vi
) convertir des sauts de ligne DOS / Windows en Unix?
Les commandes dos2unix
et unix2dos
ne sont pas disponibles sur certains systèmes. Comment puis-je les émuler avec des commandes comme sed
/ awk
/ tr
?
dos2unix
aide de votre gestionnaire de paquets, c'est vraiment beaucoup plus simple et existe sur la plupart des plates-formes.Réponses:
Vous pouvez utiliser
tr
pour convertir de DOS en Unix; toutefois, vous ne pouvez le faire en toute sécurité que si CR n'apparaît dans votre fichier que comme premier octet d'une paire d'octets CRLF. C'est généralement le cas. Vous utilisez ensuite:Notez que le nom
DOS-file
est différent du nomUNIX-file
; si vous essayez d'utiliser le même nom deux fois, vous vous retrouverez sans données dans le fichier.Vous ne pouvez pas faire l'inverse (avec le «tr» standard).
Si vous savez comment entrer le retour chariot dans un script ( control-V, control-Mpour entrer control-M), alors:
où le «^ M» est le caractère de contrôle-M. Vous pouvez également utiliser le mécanisme de
bash
cotation ANSI-C pour spécifier le retour chariot:Cependant, si vous devez le faire très souvent (plus d'une fois, en gros), il est beaucoup plus judicieux d'installer les programmes de conversion (par exemple
dos2unix
etunix2dos
, ou peutdtou
- être etutod
) et de les utiliser.Si vous devez traiter des répertoires et sous-répertoires entiers, vous pouvez utiliser
zip
:Cela va créer une archive zip avec des fins de ligne changées de CRLF en CR.
unzip
mettra ensuite les fichiers convertis en place (et vous demandera fichier par fichier - vous pouvez répondre: Oui à tous). Remerciements à @vmsnomad pour l'avoir signalé.la source
tr -d '\015' <DOS-file >UNIX-file
oùDOS-file
==UNIX-file
résulte juste en un fichier vide. Malheureusement, le fichier de sortie doit être un fichier différent.sed
option GNU-i
(pour sur place) fonctionne; les limites sont les fichiers liés et les liens symboliques. Lasort
commande a «toujours» (depuis 1979, sinon plus tôt) pris en charge l'-o
option qui peut répertorier l'un des fichiers d'entrée. Cependant, c'est en partie parce quesort
doit lire toutes ses entrées avant de pouvoir écrire l'une de ses sorties. D'autres programmes prennent sporadiquement en charge l'écrasement d'un de leurs fichiers d'entrée. Vous pouvez trouver un programme à usage général (script) pour éviter les problèmes dans «l'environnement de programmation UNIX» de Kernighan & Pike.sed -i $'s/\r$//' filename
- pour éditer sur place. Je travaille sur une machine qui n'a pas accès à Internet, donc l'installation de logiciels pose problème.jetez un oeil ici pour des exemples en utilisant
sed
:Utilisez
sed -i
pour la conversion sur place, par exemplesed -i 's/..../' file
.la source
\r
:tr "\r" "\n" < infile > outfile
-d
est présenté plus fréquemment et n'aidera pas dans la "seule\r
" situation.\r
pour\n
effet de double-espacer les fichiers; chaque ligne CRLF unique se terminant par DOS devient\n\n
sous Unix.Faire cela avec POSIX est délicat:
POSIX Sed ne prend pas en charge
\r
ou\15
. Même si c'est le cas, l'option en place-i
n'est pas POSIXPOSIX Awk ne prend pas en charge
\r
et\15
, cependant, l'-i inplace
option n'est pas POSIXd2u et dos2unix ne sont pas des utilitaires POSIX , mais ex est
Ex Posix ne supporte pas
\r
,\15
,\n
ou\12
Pour supprimer les retours chariot:
Pour ajouter des retours chariot:
la source
tr
\r
Vous pouvez donc également utiliserprintf '%s\n' '%!tr -d "\r"' x | ex file
(bien que cela soit accordé, cela a été supprimé\r
même s'il n'est pas immédiatement précédent\n
). De plus, l'-b
option àex
n'est pas spécifiée par POSIX.Vous pouvez utiliser vim par programme avec l'option -c {commande}:
Dos à Unix:
Unix à dos:
"set ff = unix / dos" signifie changer le format de fichier (ff) du fichier au format de fin de ligne Unix / DOS
": wq" signifie écrire un fichier sur le disque et quitter l'éditeur (permettant d'utiliser la commande en boucle)
la source
vi
saura ce que cela:wq
signifie. Pour ceux qui ne veulent pas que les 3 caractères signifient 1) ouvrir la zone de commande vi, 2) écrire et 3) quitter.En utilisant AWK, vous pouvez faire:
En utilisant Perl, vous pouvez faire:
la source
awk
.Pour convertir un fichier sur place, utilisez
Pour sortir du texte converti dans un autre fichier, utilisez
Vous pouvez l'installer sur Ubuntu ou Debian avec
ou sur macOS en utilisant homebrew
la source
Ce problème peut être résolu avec des outils standard, mais il y a suffisamment de pièges pour les imprudents que je vous recommande d'installer la
flip
commande, qui a été écrite il y a plus de 20 ans par Rahul Dhesi, l'auteur dezoo
. Il fait un excellent travail de conversion des formats de fichiers tout en évitant, par exemple, la destruction par inadvertance de fichiers binaires, ce qui est un peu trop facile si vous vous contentez de modifier chaque CRLF que vous voyez ...la source
Les solutions publiées jusqu'à présent ne traitent qu'une partie du problème, convertissant le CRLF de DOS / Windows en LF d'Unix; la partie qui leur manque est que DOS utilise CRLF comme séparateur de ligne , tandis qu'Unix utilise LF comme terminateur de ligne . La différence est qu'un fichier DOS (généralement) n'aura rien après la dernière ligne du fichier, contrairement à Unix. Pour effectuer la conversion correctement, vous devez ajouter ce LF final (sauf si le fichier est de longueur nulle, c'est-à-dire qu'il ne contient aucune ligne). Mon incantation préférée pour cela (avec un peu de logique supplémentaire pour gérer les fichiers séparés par CR de style Mac, et non les fichiers molesters qui sont déjà au format Unix) est un peu de perl:
Notez que cela envoie la version Unixified du fichier à stdout. Si vous souhaitez remplacer le fichier par une version Unixified, ajoutez l'
-i
indicateur perl .la source
Si vous n'avez pas accès à dos2unix , mais pouvez lire cette page, vous pouvez copier / coller dos2unix.py à partir d'ici.
Post-cross du superutilisateur .
la source
dos2unix
convertit tous les fichiers d'entrée par défaut. Votre utilisation implique un-n
paramètre. Et le réeldos2unix
est un filtre qui lit depuis stdin, écrit dans stdout si les fichiers ne sont pas fournis.Super duper facile avec PCRE;
En tant que script, ou remplacez
$@
par vos fichiers.la source
--
. J'ai choisi cette solution car elle est facile à comprendre et à adapter pour moi. Pour info, voici ce que font les commutateurs:-p
supposer une boucle "while input",-i
éditer le fichier d'entrée en place,-e
exécuter la commande suivanteUne solution awk encore plus simple sans programme:
Techniquement, «1» est votre programme, b / c awk en nécessite un lorsque l'option est donnée.
MISE À JOUR : Après avoir revu cette page pour la première fois depuis longtemps, je me suis rendu compte que personne n'avait encore posté de solution interne, alors en voici une:
la source
awk -v RS='\r\n' '1' dos.txt > unix.txt
awk
ou unesed
solution. En outre, vous devez utiliserwhile IFS= read -r line
pour conserver fidèlement les lignes d'entrée, sinon les espaces de début et de fin sont coupés (en variante, n'utilisez aucun nom de variable dans laread
commande et travaillez avec$REPLY
).Je venais de réfléchir à cette même question (côté Windows, mais également applicable à Linux.) Étonnamment, personne n'a mentionné une manière très automatisée de faire la conversion CRLF <-> LF pour les fichiers texte en utilisant un bon vieux
zip -ll
option (Info-ZIP):REMARQUE: cela créerait un fichier zip préservant les noms de fichiers d'origine mais convertissant les fins de ligne en LF. Ensuite
unzip
, les fichiers seraient extraits au format zip, c'est-à-dire avec leurs noms d'origine (mais avec les terminaisons LF), ce qui inviterait à remplacer les fichiers d'origine locaux, le cas échéant.Extrait pertinent de
zip --help
:la source
fait intéressant dans mon git-bash sur windows
sed ""
a déjà fait l'affaire:Ma conjecture est que sed les ignore lors de la lecture des lignes de l'entrée et écrit toujours les fins de ligne Unix sur la sortie.
la source
Cela a fonctionné pour moi
la source
Pour Mac osx si vous avez installé homebrew [ http://brew.sh/
Assurez-vous d'avoir fait des copies des fichiers, car cette commande modifiera les fichiers en place. L'option -c mac rend le commutateur compatible avec osx.
la source
-c mac
, ce qui est pour convertir lesCR
nouvelles lignes pré-OS X uniquement. Vous souhaitez utiliser ce mode uniquement pour les fichiers vers et depuis Mac OS 9 ou antérieur.TIMTOWTDI!
Basé sur @GordonDavisson
Il faut considérer la possibilité de
[noeol]
...la source
Vous pouvez utiliser awk. Définissez le séparateur d'enregistrement (
RS
) sur une expression rationnelle qui correspond à tous les caractères de nouvelle ligne ou aux caractères possibles. Et définissez le séparateur d'enregistrement de sortie (ORS
) sur le caractère de nouvelle ligne de style Unix.la source
git diff
montre ^ M, édité dans vim)Sous Linux, il est facile de convertir ^ M (ctrl-M) en * nix newlines (^ J) avec sed.
Ce sera quelque chose comme ça sur la CLI, il y aura en fait un saut de ligne dans le texte. Cependant, le \ passe ce ^ J à sed:
Vous obtenez cela en utilisant ^ V (ctrl-V), ^ M (ctrl-M) et \ (barre oblique inverse) pendant que vous tapez:
la source
Étant donné que la question mentionne sed, c'est la façon la plus simple d'utiliser sed pour y parvenir. Ce que dit l'expression, c'est remplacer tous les retours chariot et sauts de ligne par seulement des sauts de ligne uniquement. C'est ce dont vous avez besoin lorsque vous passez de Windows à Unix. J'ai vérifié que cela fonctionne.
la source
En tant qu'extension de la solution Unix vers DOS de Jonathan Leffler, pour convertir en toute sécurité en DOS lorsque vous n'êtes pas sûr des fins de ligne actuelles du fichier:
Cela vérifie que la ligne ne se termine pas déjà dans CRLF avant la conversion en CRLF.
la source
J'ai créé un script basé sur la réponse acceptée afin que vous puissiez le convertir directement sans avoir besoin d'un fichier supplémentaire à la fin et le supprimer et le renommer ensuite.
assurez-vous simplement que si vous avez un fichier comme "file1.txt" que "file1.txt2" n'existe pas déjà ou qu'il sera écrasé, je l'utilise comme un emplacement temporaire pour stocker le fichier.
la source
Avec bash 4.2 et plus récent, vous pouvez utiliser quelque chose comme ceci pour supprimer le CR de fin, qui utilise uniquement les fonctions intégrées bash:
la source
J'ai essayé le fichier.txt de sed / ^ M $ // 'sur OSX ainsi que plusieurs autres méthodes ( http://www.thingy-ma-jig.co.uk/blog/25-11-2010/fixing- dos-line-endings ou http://hintsforums.macworld.com/archive/index.php/t-125.html ). Aucun n'a fonctionné, le fichier est resté inchangé (entre Ctrl-v Enter était nécessaire pour reproduire ^ M). Au final, j'ai utilisé TextWrangler. Ce n'est pas strictement une ligne de commande mais cela fonctionne et il ne se plaint pas.
la source