Conversione della formattazione newline da Mac a Windows


133

Ho bisogno di un programma di utilità / script di conversione che convertirà un file di dump .sql generato su Mac in uno leggibile su Windows. Questa è la continuazione di un problema che ho avuto qui . Il problema sembra riguardare la formattazione di nuova riga in file di testo, ma non riesco a trovare uno strumento per effettuare la conversione ...


3
Uno strumento generico che ho realizzato dopo aver trovato nessuna soluzione soddisfacente con forza industriale github.com/mdolidon/endlines
Mathias Dolidon

Risposte:


134

Windows utilizza carriage return+ line feedper newline:

\r\n

Unix utilizza solo Line feedper newline:

\n

In conclusione, è sufficiente sostituire ogni occorrenza di \nby \r\n.
Entrambi unix2dose dos2unixnon sono disponibili per impostazione predefinita su Mac OSX.
Fortunatamente, puoi semplicemente usare Perlo sedfare il lavoro:

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

Snippet di codice da:
http://it.wikipedia.org/wiki/Newline#Conversion_utilities


36
Il sedcomando da UNIX a DOS non funziona per me su OS X Lion: inserisce semplicemente il testo "r" alla fine di ogni riga. Il perlcomando funziona però.
Ergwun,

7
OSX utilizza la versione precedente di sed. Uso Homebrew per OSX e ho installato gnu-sed. Si utilizza con il comando "gsed" invece di "sed". Che funzioni.
Giovanni

2
Usa invece Homebrew per ottenere i pacchetti dos2unix e unix2dos.
Pratyush,

10
OS X Yosemite ha ancora lo stesso problema sed, ma puoi aggirarlo senza installare Homebrew, gnu-sed o unix2dos: Usa sed -e 's/$/^M/' inputfile > outputfile, dove si ^Mtrova un carattere di controllo prodotto dalla riga di comando tramite Ctrl+V Ctrl+M.
LarsH,

2
Un'altra soluzione alternativa per Mac OS (testata su 10.13.6 High Sierra): inserire una $prima della virgoletta singola contenente il comando sed: sed $'s/\r$//'Spiegazione: bash decodifica backslash-escape nelle $'...'stringhe. Vedi gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html per i dettagli.
jcsahnwaldt Ripristina Monica il

127

Questa è una versione migliorata della risposta di Anne: se usi perl, puoi fare la modifica sul file "sul posto" piuttosto che generare un nuovo file:

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

5
La cosa fantastica di questi script è che mostrano, con le espressioni regolari, ESATTAMENTE ciò che deve essere la conversione di fine riga per convertire in entrambi i formati, a partire da qualsiasi cosa.
PBR

fare attenzione con ciò su alcune installazioni di Cygwin / git bash su sistemi Windows. Questo può darti Can't do inplace edit on file: Permission denied.ed eliminare il file. Cerca invece altre utilità.
Dennis,

Grazie mille per aver mostrato "Converti in Unix". Ero in quel modo e la tua doppia risposta mi ha aiutato e mi ha dato il mio voto.
null

112

Puoi installare unix2dos con Homebrew

brew install unix2dos

Quindi puoi farlo:

unix2dos file-to-convert

Puoi anche convertire i file DOS in unix:

dos2unix file-to-convert

9
Per chiunque si imbatta ora in questo, la formula Homebrew viene ora chiamata dos2unix. Lo vorrai brew install dos2unix.
Geoff,

13
In realtà, brew install unix2doso brew install dos2unixfunziona bene. Installano lo stesso pacchetto. Usa qualunque nome ti parli :)
Steven Hirlston,

2
Or con MacPorts : port install dos2unix.
Fang

16

Probabilmente vuoi 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.

Puoi eseguire unix2dossul tuo computer DOS / Windows usando cygwin o sul tuo Mac usando MacPorts .


unix2dos / dos2unix non esistono sul mio mac e non ho trovato alcun posto dove installarli- Ne conosci qualche?
Yarin,

@mgadda: +1 - sì, sono passato a homebrew da MacPorts qualche tempo fa e non ho guardato indietro.
Paul R,

15

Basta treliminare:

tr -d "\r" <infile.txt >outfile.txt

1
Ho provato perl e sed, non ha funzionato (avrei potuto capirlo, non valeva la pena provarlo). Questo ha funzionato alla grande.
Casuale Insano

Questa è stata la prima soluzione che ho trovato ai numeri di riga di BBEdit che non corrispondevano al conteggio delle righe mentre le leggevo usando Python (e non corrispondendo wc -l).
Daryl Spitzer, il

1
questo elimina tutte le interruzioni di riga che in realtà ho ancora bisogno di avere interruzioni di linea ma con \ n
UserYmY

" hints.macworld.com/article.php?story=20031018164326986 " ha anche una buona descrizione di come utilizzare il trcomando per eseguire varie conversioni. Usa hexdumpo simili per scoprire esattamente quale tipo di convenzione di fine riga è ora utilizzata nel file.
Mike Robinson,

6
  1. Installa dos2unix con homebrew
  2. Esegui find ./ -type f -exec dos2unix {} \;per convertire ricorsivamente tutti i finali di linea all'interno della cartella corrente

2

vimpuò anche convertire file da UNIX in formato DOS. Per esempio:

vim hello.txt <<EOF
:set fileformat=dos
:wq
EOF

2

Quello che segue è uno script completo basato sulle risposte precedenti insieme al controllo di integrità e funziona su Mac OS X e dovrebbe funzionare anche su altri sistemi Linux / Unix (anche se questo non è stato testato).

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

1

Ecco un approccio davvero semplice, ha funzionato bene per me, per gentile concessione del blog di Davy Schmeits :

cat foo | col -b > foo2

Dove foo è il file con i caratteri Control + M alla fine della riga e foo2 il nuovo file che si sta creando.


0

Su Yosemite OSX, utilizzare questo comando:

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

dove ^Msi ottiene la sequenza premendo Ctrl+ Vquindi Enter.


Si noti inoltre che sed si fa capire backslash-sfugge, come \re `` \ n 'e quindi può anche utilizzare questi nella sostituzione. In realtà non devi inserire un controllo letterale-M per fare riferimento a quel personaggio (o qualsiasi altro). Il principio di usare sed(e -i) per fare qualsiasi tipo di conversione di questo tipo è molto buono, perché, a differenza tr, non sei limitato a "un personaggio alla volta".
Mike Robinson,

0

Espandendo le risposte di Anne e JosephH, usando il perl in una breve sceneggiatura del perl, dal momento che sono troppo pigro per scrivere il perl-one-liner molto tempo.
Crea un file, chiamato ad esempio "unix2dos.pl" e inseriscilo in una directory nel tuo percorso. Modifica il file per contenere le 2 righe:

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

Supponendo che "quale perl" ritorni "/ usr / bin / perl" sul tuo sistema. Rendi eseguibile il file (chmod u + x unix2dos.pl).

Esempio:
$ echo "ciao"> xxx
$ od -c xxx (verifica che il file termini con un nl)
0000000 ciao \ n

$ unix2dos.pl xxx
$ od -c xxx (verificando che finisca ora in cr lf)
0000000 ciao \ r \ n


0

In Xcode 9 nel pannello di sinistra apri / scegli il tuo file nel navigatore del progetto . Se il file non è presente, trascinalo nel navigatore del progetto .

Nel pannello di destra trova Impostazioni di testo e modifica le terminazioni di riga in Windows (CRLF) .

XCode screendumpscreendump da XCode

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.