445 votes

Comment convertir la nouvelle ligne DOS/Windows en nouvelle ligne Unix dans le script bash script ?

Comment puis-je programmer (c'est-à-dire sans utiliser, par exemple, la fonction vi ) convertir les nouvelles lignes DOS/Windows en lignes Unix ?

Le site dos2unix et unix2dos ne sont pas disponibles sur certains systèmes, comment puis-je les émuler avec des commandes telles que sed / awk / tr ?

417voto

Jonathan Leffler Points 299946

Vous pouvez utiliser tr pour convertir du DOS à Unix, vous ne pouvez le faire en toute sécurité que si CR n'apparaît dans votre fichier que comme le premier octet d'une paire d'octets CRLF. C'est généralement le cas. Vous utilisez alors :

tr -d '\015' <DOS-file >UNIX-file

Notez que le nom DOS-file est différent du nom UNIX-file ; si vous essayez d'utiliser deux fois le même nom, vous vous retrouverez sans données dans le fichier.

Vous ne pouvez pas le faire dans l'autre sens (avec le "tr" standard).

Si vous savez comment entrer un retour chariot dans un script ( control-V , control-M pour entrer le contrôle-M), puis :

sed 's/^M$//'     # DOS to Unix
sed 's/$/^M/'     # Unix to DOS

où "^M" est le caractère "control-M". Vous pouvez également utiliser le caractère bash Cotation ANSI-C pour spécifier le retour chariot :

sed $'s/\r$//'     # DOS to Unix
sed $'s/$/\r/'     # Unix to DOS

Question : pourquoi ne pouvez-vous pas obtenir dos2unix et unix2dos installé (ou dtou et utod ) ? Ou s'agit-il d'une restriction imposée par la personne qui fixe les devoirs ?

84voto

ghostdog74 Points 86060
tr -d "\r" < file

Jetez un coup d'œil ici pour des exemples utilisant sed :

# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
sed 's/.$//'               # assumes that all lines end with CR/LF
sed 's/^M$//'              # in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//'            # works on ssed, gsed 3.02.80 or higher

# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format.
sed "s/$/`echo -e \\\r`/"            # command line under ksh
sed 's/$'"/`echo \\\r`/"             # command line under bash
sed "s/$/`echo \\\r`/"               # command line under zsh
sed 's/$/\r/'                        # gsed 3.02.80 or higher

Utilisez sed -i pour la conversion en place, par exemple sed -i 's/..../' file .

37voto

Steven Penny Points 18523

sed peut faire la conversion en place

sed -i 's/\r//' CRLF.txt

Plus d'informations

\-i    edit files in place 

Scripts utiles en une ligne pour sed

19voto

Norman Ramsey Points 115730

Ce problème peut être résolu à l'aide d'outils standard, mais il y a suffisamment de pièges pour les imprudents pour que je vous recommande d'installer l'application flip qui a été écrit il y a plus de 20 ans par Rahul Dhesi, l'auteur de zoo . Il fait un excellent travail de conversion de 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 courir partout en modifiant chaque CRLF que vous voyez...

15voto

Gordon Davisson Points 22534

Les solutions proposées jusqu'à présent ne traitent qu'une partie du problème, en convertissant le CRLF de DOS/Windows en LF d'Unix ; la partie manquante est que le DOS utilise le CRLF comme une ligne. séparateur alors qu'Unix utilise LF comme ligne terminator . La différence est qu'un fichier DOS n'aura (généralement) rien après la dernière ligne du fichier, alors qu'Unix en aura. Pour effectuer la conversion correctement, vous devez ajouter ce dernier LF (à moins que le fichier soit de longueur zéro, c'est-à-dire qu'il ne contienne aucune ligne). Mon incantation préférée pour cela (avec un peu de logique ajoutée pour gérer les fichiers séparés par des CR de style Mac, et ne pas maltraiter les fichiers qui sont déjà au format unix) est un peu de perl :

perl -pe 'if ( s/\r\n?/\n/g ) { $f=1 }; if ( $f || ! $m ) { s/([^\n])\z/$1\n/ }; $m=1' PCfile.txt

Notez que cela envoie la version Unixifiée du fichier à stdout. Si vous voulez remplacer le fichier par une version unifiée, ajoutez la fonction de perl -i drapeau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X