Conversion du formatage de nouvelle ligne de Mac vers Windows

133

J'ai besoin d'un utilitaire / script de conversion qui convertira un fichier de vidage .sql généré sur Mac en un fichier lisible sur Windows. C'est la continuation d'un problème que j'ai eu ici . Le problème semble être lié au formatage de nouvelle ligne dans les fichiers texte, mais je ne trouve pas d'outil pour effectuer la conversion ...

Yarin
la source
3
Un outil générique que j'ai créé après n'avoir trouvé aucune solution satisfaisante avec une force industrielle github.com/mdolidon/endlines
Mathias Dolidon

Réponses:

134

Windows utilise carriage return+ line feedpour la nouvelle ligne:

\r\n

Unix utilise uniquement Line feedpour la nouvelle ligne:

\n

En conclusion, remplacez simplement chaque occurrence de \npar \r\n.
Les deux unix2doset dos2unixne sont pas disponibles par défaut sur Mac OSX.
Heureusement, vous pouvez simplement utiliser Perlou sedpour faire le travail:

sed -e 's/$/\r/' inputfile > outputfile                # UNIX to DOS  (adding CRs)
sed -e 's/\r$//' inputfile > outputfile                # DOS  to UNIX (removing CRs)
perl -pe 's/\r\n|\n|\r/\r\n/g' inputfile > outputfile  # Convert to DOS
perl -pe 's/\r\n|\n|\r/\n/g'   inputfile > outputfile  # Convert to UNIX
perl -pe 's/\r\n|\n|\r/\r/g'   inputfile > outputfile  # Convert to old Mac

Extrait de code de:
http://en.wikipedia.org/wiki/Newline#Conversion_utilities

Anne
la source
36
La sedcommande UNIX vers DOS ne fonctionne pas pour moi sous OS X Lion - elle insère simplement le texte "r" à la fin de chaque ligne. La perlcommande fonctionne cependant.
Ergwun
7
OSX utilise une ancienne version de sed. J'utilise Homebrew pour OSX et j'ai installé gnu-sed. Vous utilisez avec la commande "gsed" au lieu de "sed". Ça marche.
John
2
Utilisez Homebrew pour obtenir les packages dos2unix et unix2dos à la place.
Pratyush
10
OS X Yosemite a toujours le même problème avec sed, mais vous pouvez le contourner sans installer Homebrew, gnu-sed ou unix2dos: Utilisez sed -e 's/$/^M/' inputfile > outputfile, où ^Mest un caractère de contrôle produit sur la ligne de commande via Ctrl+V Ctrl+M.
LarsH
2
Une autre solution de contournement pour Mac OS (testé sur 10.13.6 High Sierra): Placez un $avant le guillemet simple contenant la commande sed: sed $'s/\r$//'Explication: bash décode les échappements anti-slash en $'...'chaînes. Voir gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html pour plus de détails.
jcsahnwaldt Réintègre Monica le
127

Ceci est une version améliorée de la réponse d'Anne - si vous utilisez perl, vous pouvez faire l'édition sur le fichier `` sur place '' plutôt que de générer un nouveau fichier:

perl -pi -e 's/\r\n|\n|\r/\r\n/g' file-to-convert  # Convert to DOS
perl -pi -e 's/\r\n|\n|\r/\n/g'   file-to-convert  # Convert to UNIX
JosephH
la source
5
Ce qui est génial à propos de ces scripts, c'est qu'ils montrent, avec les expressions régulières, EXACTEMENT ce que la conversion de fin de ligne doit être pour convertir dans l'un ou l'autre format, à partir de n'importe quoi.
pbr
soyez prudent avec cela sur certaines installations Cygwin / git bash sur les systèmes Windows. Cela peut vous donner Can't do inplace edit on file: Permission denied.et supprimer le fichier. Regardez plutôt dans d'autres utilitaires.
Dennis
Un grand merci pour avoir montré "Convertir en Unix". J'étais après cette voie et votre double réponse m'a aidé et a obtenu mon vote favorable.
null
112

Vous pouvez installer unix2dos avec Homebrew

brew install unix2dos

Ensuite, vous pouvez faire ceci:

unix2dos file-to-convert

Vous pouvez également convertir des fichiers dos en unix:

dos2unix file-to-convert
Steven Hirlston
la source
9
Pour tous ceux qui rencontrent cela maintenant, la formule Homebrew est maintenant appelée dos2unix. Vous voudrez brew install dos2unix.
Geoff
13
En fait, soit brew install unix2dosou brew install dos2unixfonctionne bien. Ils installent le même package. Utilisez le nom qui vous parle :)
Steven Hirlston
2
Ou avec Macports : port install dos2unix.
Fang
16

Vous voulez probablement unix2dos :

$ man unix2dos

NAME
       dos2unix - DOS/MAC to UNIX and vice versa text file format converter

SYNOPSIS
           dos2unix [options] [-c CONVMODE] [-o FILE ...] [-n INFILE OUTFILE ...]
           unix2dos [options] [-c CONVMODE] [-o FILE ...] [-n INFILE OUTFILE ...]

DESCRIPTION
       The Dos2unix package includes utilities "dos2unix" and "unix2dos" to convert plain text files in DOS or MAC format to UNIX format and vice versa.  Binary files and non-
       regular files, such as soft links, are automatically skipped, unless conversion is forced.

       Dos2unix has a few conversion modes similar to dos2unix under SunOS/Solaris.

       In DOS/Windows text files line endings exist out of a combination of two characters: a Carriage Return (CR) followed by a Line Feed (LF).  In Unix text files line
       endings exists out of a single Newline character which is equal to a DOS Line Feed (LF) character.  In Mac text files, prior to Mac OS X, line endings exist out of a
       single Carriage Return character. Mac OS X is Unix based and has the same line endings as Unix.

Vous pouvez exécuter unix2dossur votre machine DOS / Windows en utilisant cygwin ou sur votre Mac en utilisant MacPorts .

Paul R
la source
unix2dos / dos2unix n'existent pas sur mon mac et je n'ai trouvé aucun endroit pour les installer - En connaissez-vous?
Yarin
@mgadda: +1 - oui, je suis passé à l'homebrew de MacPorts il y a quelque temps et je n'ai pas regardé en arrière.
Paul R
15

trSupprimez simplement :

tr -d "\r" <infile.txt >outfile.txt
parahren
la source
1
J'ai essayé perl et sed, cela n'a pas fonctionné (j'aurais pu le comprendre, cela ne valait pas la peine d'essayer). Cela a très bien fonctionné.
RandomInsano
C'était la première solution que j'ai trouvée aux numéros de ligne de BBEdit ne correspondant pas au nombre de lignes lorsque je les lisais en utilisant Python (et non en correspondance wc -l).
Daryl Spitzer
1
cela supprime tous les sauts de ligne dont j'ai encore besoin, mais avec \ n
UserYmY
" hints.macworld.com/article.php?story=20031018164326986 " contient également une bonne description de l'utilisation de la trcommande pour effectuer diverses conversions. Utilisez hexdumpou similaire pour savoir exactement quelle sorte de convention de fin de ligne est maintenant utilisée dans le fichier.
Mike Robinson
6
  1. Installez dos2unix avec homebrew
  2. Exécuter find ./ -type f -exec dos2unix {} \;pour convertir récursivement toutes les fins de ligne dans le dossier actuel
AAverin
la source
2

vimpeut également convertir des fichiers du format UNIX au format DOS. Par exemple:

vim hello.txt <<EOF
:set fileformat=dos
:wq
EOF
Stephen Quan
la source
2

Ce qui suit est un script complet basé sur les réponses ci-dessus avec la vérification de la cohérence et fonctionne sur Mac OS X et devrait également fonctionner sur d'autres systèmes Linux / Unix (bien que cela n'ait pas été testé).

#!/bin/bash

# http://stackoverflow.com/questions/6373888/converting-newline-formatting-from-mac-to-windows

# =============================================================================
# =
# = FIXTEXT.SH by ECJB
# =
# = USAGE:  SCRIPT [ MODE ] FILENAME
# =
# = MODE is one of unix2dos, dos2unix, tounix, todos, tomac
# = FILENAME is modified in-place
# = If SCRIPT is one of the modes (with or without .sh extension), then MODE
# =   can be omitted - it is inferred from the script name.
# = The script does use the file command to test if it is a text file or not,
# =   but this is not a guarantee.
# =
# =============================================================================

clear
script="$0"
modes="unix2dos dos2unix todos tounix tomac"

usage() {
    echo "USAGE:  $script [ mode ] filename"
    echo
    echo "MODE is one of:"
    echo $modes
    echo "NOTE:  The tomac mode is intended for old Mac OS versions and should not be"
    echo "used without good reason."
    echo
    echo "The file is modified in-place so there is no output filename."
    echo "USE AT YOUR OWN RISK."
    echo
    echo "The script does try to check if it's a binary or text file for sanity, but"
    echo "this is not guaranteed."
    echo
    echo "Symbolic links to this script may use the above names and be recognized as"
    echo "mode operators."
    echo
    echo "Press RETURN to exit."
    read answer
    exit
}

# -- Look for the mode as the scriptname
mode="`basename "$0" .sh`"
fname="$1"

# -- If 2 arguments use as mode and filename
if [ ! -z "$2" ] ; then mode="$1"; fname="$2"; fi

# -- Check there are 1 or 2 arguments or print usage.
if [ ! -z "$3" -o -z "$1" ] ; then usage; fi

# -- Check if the mode found is valid.
validmode=no
for checkmode in $modes; do if [ $mode = $checkmode ] ; then validmode=yes; fi; done
# -- If not a valid mode, abort.
if [ $validmode = no ] ; then echo Invalid mode $mode...aborting.; echo; usage; fi

# -- If the file doesn't exist, abort.
if [ ! -e "$fname" ] ; then echo Input file $fname does not exist...aborting.; echo; usage; fi

# -- If the OS thinks it's a binary file, abort, displaying file information.
if [ -z "`file "$fname" | grep text`" ] ; then echo Input file $fname may be a binary file...aborting.; echo; file "$fname"; echo; usage; fi

# -- Do the in-place conversion.
case "$mode" in
#   unix2dos ) # sed does not behave on Mac - replace w/ "todos" and "tounix"
#       # Plus, these variants are more universal and assume less.
#       sed -e 's/$/\r/' -i '' "$fname"             # UNIX to DOS  (adding CRs)
#       ;;
#   dos2unix )
#       sed -e 's/\r$//' -i '' "$fname"             # DOS  to UNIX (removing CRs)
#           ;;
    "unix2dos" | "todos" )
        perl -pi -e 's/\r\n|\n|\r/\r\n/g' "$fname"  # Convert to DOS
        ;;
    "dos2unix" | "tounix" )
        perl -pi -e 's/\r\n|\n|\r/\n/g'   "$fname"  # Convert to UNIX
        ;;
    "tomac" )
        perl -pi -e 's/\r\n|\n|\r/\r/g'   "$fname"  # Convert to old Mac
        ;;
    * ) # -- Not strictly needed since mode is checked first.
        echo Invalid mode $mode...aborting.; echo; usage
        ;;
esac

# -- Display result.
if [ "$?" = "0" ] ; then echo "File $fname updated with mode $mode."; else echo "Conversion failed return code $?."; echo; usage; fi
ECJB
la source
1

Voici une approche très simple, qui a bien fonctionné pour moi, avec la permission du Weblog de Davy Schmeits :

cat foo | col -b > foo2

Où foo est le fichier qui a les caractères Control + M à la fin de la ligne, et foo2 le nouveau fichier que vous créez.

patdevelop
la source
0

Sur Yosemite OSX, utilisez cette commande:

sed -e 's/^M$//' -i '' filename

où la ^Mséquence est réalisée en appuyant sur Ctrl+ Vpuis Enter.

Olga
la source
Notez également que sed ne comprennent antislash échappe par exemple \ret `` \ n` et peut donc aussi utiliser dans la substitution. Vous n'avez pas besoin de saisir un contrôle-M littéral pour faire référence à ce caractère (ou à tout autre). Le principe d'utiliser sed(et -i) pour effectuer toute sorte de conversion de ce type est très bon, car, contrairement à cela tr, vous n'êtes pas limité à «un caractère à la fois».
Mike Robinson
0

Développant les réponses d'Anne et JosephH, en utilisant perl dans un court script perl, car je suis trop paresseux pour taper le perl-one-liner très souvent.
Créez un fichier, nommé par exemple "unix2dos.pl" et placez-le dans un répertoire de votre chemin. Modifiez le fichier pour qu'il contienne les 2 lignes:

#!/usr/bin/perl -wpi
s/\n|\r\n/\r\n/g;

En supposant que "which perl" renvoie "/ usr / bin / perl" sur votre système. Rendez le fichier exécutable (chmod u + x unix2dos.pl).

Exemple:
$ echo "hello"> xxx
$ od -c xxx (vérifiant que le fichier se termine par un nl)
0000000 bonjour \ n

$ unix2dos.pl xxx
$ od -c xxx (vérifiant qu'il se termine maintenant par cr lf)
0000000 bonjour \ r \ n

avy
la source
0

Dans Xcode 9 dans le panneau de gauche, ouvrez / choisissez votre fichier dans le navigateur de projet . Si le fichier n'est pas là, déposez-le dans le navigateur de projet .

Sur le panneau de droite, recherchez Paramètres de texte et remplacez les fins de ligne par Windows (CRLF) .

Screendump XCodescreendump de XCode

matrice3003
la source