Convertir formato de nueva línea de Mac a Windows

133

Necesito una utilidad / script de conversión que convierta un archivo de volcado .sql generado en Mac a uno legible en Windows. Esta es una continuación de un problema que tuve aquí . El problema parece ser con el formato de nueva línea en archivos de texto, pero no puedo encontrar una herramienta para hacer la conversión ...

Yarin
fuente
3
Una herramienta genérica que hice después de no encontrar una solución satisfactoria con fuerza industrial github.com/mdolidon/endlines
Mathias Dolidon

Respuestas:

134

Windows usa carriage return+ line feedpara nueva línea:

\r\n

Unix solo usa Line feedpara nueva línea:

\n

En conclusión, simplemente reemplace cada aparición de \nby \r\n.
Ambos unix2dosy dos2unixno están disponibles por defecto en Mac OSX.
Afortunadamente, simplemente puede usar Perlo sedhacer el trabajo:

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

Fragmento de código de:
http://en.wikipedia.org/wiki/Newline#Conversion_utilities

Ana
fuente
36
El sedcomando para UNIX a DOS no me funciona en OS X Lion, simplemente inserta el texto "r" al final de cada línea. Sin perlembargo, el comando funciona.
Ergwun
77
OSX usa una versión anterior de sed. Utilizo Homebrew para OSX e instalé gnu-sed. Se usa con el comando "gsed" en lugar de "sed". Eso funciona.
John
2
Use Homebrew para obtener los paquetes dos2unix y unix2dos.
Pratyush
10
OS X Yosemite todavía tiene el mismo problema sed, pero puede solucionarlo sin instalar Homebrew, gnu-sed o unix2dos: Use sed -e 's/$/^M/' inputfile > outputfile, donde se ^Mproduce un carácter de control en la línea de comando Ctrl+V Ctrl+M.
LarsH
2
Otra solución para Mac OS (probado en 10.13.6 High Sierra): coloque un $antes de la comilla simple que contiene el comando sed: sed $'s/\r$//'Explicación: bash decodifica la barra invertida-escape en $'...'cadenas. Consulte gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html para obtener más detalles.
jcsahnwaldt Restablece a Monica el
127

Esta es una versión mejorada de la respuesta de Anne: si usa perl, puede hacer la edición en el archivo 'en el lugar' en lugar de generar un nuevo archivo:

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
fuente
55
Lo sorprendente de estos scripts es que muestran, con las expresiones regulares, EXACTAMENTE lo que debe ser la conversión de fin de línea para convertir a cualquier formato, comenzando desde cualquier cosa.
pbr
tenga cuidado con esto en ciertas instalaciones de Cygwin / git bash en sistemas Windows. Esto puede darle Can't do inplace edit on file: Permission denied.y eliminar el archivo. Busque otras utilidades en su lugar.
Dennis
Muchas gracias por mostrar "Convertir a Unix". Yo iba por ese camino y su doble respuesta me ayudó y consiguió mi voto positivo.
nulo
112

Puedes instalar unix2dos con Homebrew

brew install unix2dos

Entonces puedes hacer esto:

unix2dos file-to-convert

También puede convertir archivos DOS a Unix:

dos2unix file-to-convert
Steven Hirlston
fuente
9
Para cualquiera que se encuentre con esto ahora, ahora se llama la fórmula Homebrew dos2unix. Usted querrá brew install dos2unix.
Geoff
13
En realidad, ya sea brew install unix2doso brew install dos2unixfunciona bien. Instalan el mismo paquete. Usa el nombre que te
llame
2
O con MacPorts : port install dos2unix.
Fang
16

Probablemente quieras 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.

Puede ejecutar unix2dosen su máquina DOS / Windows usando cygwin o en su Mac usando MacPorts .

Paul R
fuente
unix2dos / dos2unix no existen en mi Mac y no he encontrado ningún lugar para instalarlos. ¿Conoces alguno?
Yarin
@mgadda: +1: sí, hace un tiempo cambié a homebrew desde MacPorts y no he mirado atrás.
Paul R
15

Solo trborra:

tr -d "\r" <infile.txt >outfile.txt
parahren
fuente
1
Probé perl y sed, no funcionó (podría haberlo descubierto, no valía la pena intentarlo). Esto funcionó muy bien.
RandomInsano
Esta fue la primera solución que encontré para los números de línea de BBEdit que no coinciden con el recuento de líneas cuando las leí usando Python (y no coinciden wc -l).
Daryl Spitzer
1
esto elimina todos los saltos de línea. Realmente todavía necesito tener saltos de línea, pero con \ n
UserYmY
" hints.macworld.com/article.php?story=20031018164326986 " también tiene una buena reseña sobre cómo usar el trcomando para realizar varias conversiones. Use hexdumpo similar para averiguar exactamente qué tipo de convención de fin de línea se usa ahora en el archivo.
Mike Robinson
6
  1. Instalar dos2unix con homebrew
  2. Ejecutar find ./ -type f -exec dos2unix {} \;para convertir recursivamente todos los finales de línea dentro de la carpeta actual
AAverin
fuente
2

vimTambién puede convertir archivos de UNIX a formato DOS. Por ejemplo:

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

El siguiente es un script completo basado en las respuestas anteriores, junto con la comprobación de cordura y funciona en Mac OS X y también debería funcionar en otros sistemas Linux / Unix (aunque esto no ha sido probado).

#!/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
fuente
1

Aquí hay un enfoque realmente simple, funcionó bien para mí, cortesía del Weblog de Davy Schmeits :

cat foo | col -b > foo2

Donde foo es el archivo que tiene los caracteres Control + M al final de la línea, y foo2 el nuevo archivo que está creando.

patdevelop
fuente
0

En Yosemite OSX, use este comando:

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

donde la ^Msecuencia se logra presionando Ctrl+ Vluego Enter.

Olga
fuente
También tenga en cuenta que sed qué entienden barra invertida-escapa como \ry `` \ n 'y por lo tanto también puede utilizar estos en la sustitución. En realidad, no tiene que ingresar un control-M literal para referirse a ese carácter (o cualquier otro). El principio de usar sed(y -i) para hacer cualquier tipo de conversión de este tipo es muy bueno, porque, a diferencia tr, no está limitado a "un personaje a la vez".
Mike Robinson
0

Ampliando las respuestas de Anne y JosephH, usando perl en un script corto de perl, ya que soy demasiado vago para escribir el perl-one-liner muy a la vez.
Cree un archivo, llamado por ejemplo "unix2dos.pl" y póngalo en un directorio en su ruta. Edite el archivo para contener las 2 líneas:

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

Suponiendo que "which perl" devuelve "/ usr / bin / perl" en su sistema. Haga que el archivo sea ejecutable (chmod u + x unix2dos.pl).

Ejemplo:
$ echo "hola"> xxx
$ od -c xxx (comprobando que el archivo termina con un nl)
0000000 hola \ n

$ unix2dos.pl xxx
$ od -c xxx (comprobando que termina ahora en cr lf)
0000000 hola \ r \ n

avy
fuente
0

En Xcode 9 en el panel izquierdo, abra / elija su archivo en el navegador de proyectos . Si el archivo no está allí, colóquelo en el navegador del proyecto .

En el panel derecho, busque la configuración de texto y cambie los finales de línea a Windows (CRLF) .

XCode screendumpscreendump de XCode

matrix3003
fuente