Konvertieren der Zeilenumbruchformatierung von Mac nach Windows

133

Ich benötige ein Konvertierungsdienstprogramm / -skript, das eine auf dem Mac generierte SQL-Dump-Datei in eine unter Windows lesbare konvertiert. Dies ist eine Fortsetzung eines Problems, das ich hier hatte . Das Problem scheint bei der Formatierung von Zeilenumbrüchen in Textdateien zu liegen, aber ich kann kein Tool für die Konvertierung finden ...

Yarin
quelle
3
Ein generisches Werkzeug, das ich gemacht habe, nachdem ich keine zufriedenstellende Lösung mit industrieller Stärke gefunden hatte. Github.com/mdolidon/endlines
Mathias Dolidon

Antworten:

134

Windows verwendet carriage return+ line feedfür Zeilenumbruch:

\r\n

Unix wird nur Line feedfür Zeilenumbrüche verwendet:

\n

Abschließend ersetzen Sie einfach jedes Vorkommen von \ndurch \r\n.
Beide unix2dosund dos2unixsind unter Mac OS X nicht standardmäßig verfügbar.
Glücklicherweise können Sie einfach die Arbeit verwenden Perloder sederledigen:

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

Code-Snippet von:
http://en.wikipedia.org/wiki/Newline#Conversion_utilities

Anne
quelle
36
Der sedBefehl für UNIX zu DOS funktioniert unter OS X Lion nicht - er fügt nur den Text "r" am Ende jeder Zeile ein. Der perlBefehl funktioniert jedoch.
Ergwun
7
OSX verwendet eine ältere Version von sed. Ich benutze Homebrew für OSX und habe gnu-sed installiert. Sie verwenden mit dem Befehl "gsed" anstelle von "sed". Das funktioniert.
John
2
Verwenden Sie Homebrew, um stattdessen die Pakete dos2unix und unix2dos zu erhalten.
Pratyush
10
OS X Yosemite hat immer noch das gleiche Problem sed, aber Sie können es umgehen sed -e 's/$/^M/' inputfile > outputfile, ohne Homebrew, gnu-sed oder unix2dos zu installieren: Verwenden Sie , wobei ^Mein Steuerzeichen in der Befehlszeile über erzeugt wird Ctrl+V Ctrl+M.
LarsH
2
Eine weitere Problemumgehung für Mac OS (getestet in 10.13.6 High Sierra): Setzen Sie ein $vor das einfache Anführungszeichen, das den Befehl sed enthält: sed $'s/\r$//'Erläuterung: bash dekodiert Backslash-Escapezeichen in $'...'Zeichenfolgen. Weitere Informationen finden Sie unter gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html .
jcsahnwaldt Reinstate Monica
127

Dies ist eine verbesserte Version von Annes Antwort. Wenn Sie Perl verwenden, können Sie die Datei "direkt" bearbeiten, anstatt eine neue Datei zu generieren:

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
quelle
5
Das Tolle an diesen Skripten ist, dass sie mit den regulären Ausdrücken genau zeigen, was die Konvertierung am Ende der Zeile sein muss, um in eines der beiden Formate zu konvertieren, beginnend mit irgendetwas.
pbr
Seien Sie bei bestimmten Cygwin / Git-Bash-Installationen auf Windows-Systemen vorsichtig. Dies kann Ihnen geben Can't do inplace edit on file: Permission denied.und die Datei löschen . Schauen Sie sich stattdessen andere Dienstprogramme an.
Dennis
Vielen Dank für die Anzeige von "In Unix konvertieren". Ich war hinterher und deine doppelte Antwort hat mir geholfen und meine Gegenstimme bekommen.
null
112

Sie können unix2dos mit Homebrew installieren

brew install unix2dos

Dann können Sie dies tun:

unix2dos file-to-convert

Sie können auch dos-Dateien in Unix konvertieren:

dos2unix file-to-convert
Steven Hirlston
quelle
9
Für alle, die jetzt darauf stoßen, heißt die Homebrew-Formel jetzt dos2unix. Du wirst es wollen brew install dos2unix.
Geoff
13
Eigentlich entweder brew install unix2dosoder gut brew install dos2unixfunktionieren. Sie installieren das gleiche Paket. Verwenden Sie den Namen, der zu Ihnen spricht :)
Steven Hirlston
2
Oder mit Macports : port install dos2unix.
Fang
16

Sie möchten wahrscheinlich 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.

Sie können entweder unix2dosauf Ihrem DOS / Windows-Computer mit Cygwin oder auf Ihrem Mac mit MacPorts ausgeführt werden .

Paul R.
quelle
unix2dos / dos2unix gibt es auf meinem Mac nicht und ich habe keinen Ort gefunden, an dem ich sie installieren kann. Kennen Sie einen?
Yarin
@mgadda: +1 - Ja, ich bin vor einiger Zeit von MacPorts zu Homebrew gewechselt und habe nicht zurückgeschaut.
Paul R
15

trLöschen Sie einfach :

tr -d "\r" <infile.txt >outfile.txt
parahren
quelle
1
Versuchte Perl und Sed, funktionierte nicht (ich hätte es herausfinden können, war keinen Versuch wert). Das hat super geklappt.
RandomInsano
Dies war die erste Lösung, die ich fand, wenn die Zeilennummern von BBEdit nicht mit der Anzahl der Zeilen übereinstimmten, als ich sie mit Python las (und nicht übereinstimmte wc -l).
Daryl Spitzer
1
Dies löscht alle Zeilenumbrüche, die ich eigentlich noch haben muss, aber mit \ n
UserYmY
" hints.macworld.com/article.php?story=20031018164326986 " enthält auch eine gute Beschreibung der Verwendung des trBefehls zum Durchführen verschiedener Konvertierungen. Verwenden Sie hexdumpoder ähnliches, um genau herauszufinden, welche Art von Zeilenende-Konvention jetzt in der Datei verwendet wird.
Mike Robinson
6
  1. Installieren Sie dos2unix mit Homebrew
  2. Ausführen find ./ -type f -exec dos2unix {} \;, um alle Zeilenenden im aktuellen Ordner rekursiv zu konvertieren
AAverin
quelle
2

vimkann auch Dateien von UNIX in das DOS-Format konvertieren. Beispielsweise:

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

Das Folgende ist ein vollständiges Skript, das auf den obigen Antworten zusammen mit der Überprüfung der Integrität basiert und unter Mac OS X funktioniert. Es sollte auch auf anderen Linux / Unix-Systemen funktionieren (obwohl dies nicht getestet wurde).

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

Hier ist ein wirklich einfacher Ansatz, der mit freundlicher Genehmigung von Davy Schmeits im Weblog gut funktioniert hat :

cat foo | col -b > foo2

Dabei ist foo die Datei mit den Strg + M-Zeichen am Ende der Zeile und foo2 die neue Datei, die Sie erstellen.

patdevelop
quelle
0

Verwenden Sie unter Yosemite OSX den folgenden Befehl:

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

wo die ^MSequenz durch Drücken von Ctrl+ Vdann erreicht wird Enter.

Olga
quelle
Beachten Sie auch , dass sed nicht verstehen Backslash-entkommt wie \rund `` \ n 'und kann daher auch diese in der Substitution verwenden. Sie müssen kein Literal-M eingeben, um auf dieses Zeichen (oder ein anderes) zu verweisen. Das Prinzip, sed(und -i) für jede Art von Konvertierung dieser Art zu verwenden, ist sehr gut, da Sie im Gegensatz trdazu nicht auf "jeweils ein Zeichen" beschränkt sind.
Mike Robinson
0

Erweitern Sie die Antworten von Anne und JosephH mit Perl in einem kurzen Perl-Skript, da ich zu faul bin, um den Perl-Einzeiler rechtzeitig einzugeben.
Erstellen Sie eine Datei mit dem Namen "unix2dos.pl" und legen Sie sie in einem Verzeichnis in Ihrem Pfad ab. Bearbeiten Sie die Datei so, dass sie die 2 Zeilen enthält:

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

Angenommen, "welches Perl" gibt "/ usr / bin / perl" auf Ihrem System zurück. Machen Sie die Datei ausführbar (chmod u + x unix2dos.pl).

Beispiel:
$ echo "hallo"> xxx
$ od -c xxx (prüft, ob die Datei mit einem nl endet)
0000000 hallo \ n

$ unix2dos.pl xxx
$ od -c xxx (prüft, ob es jetzt in cr
lf endet) 0000000 hallo \ r \ n

avy
quelle
0

Öffnen / wählen Sie in Xcode 9 im linken Bereich Ihre Datei im Projektnavigator . Wenn die Datei nicht vorhanden ist, legen Sie sie in den Projektnavigator .

Auf der rechten Tafel finden Texteinstellungen und ändern Zeilenenden auf Fenster (CRLF) .

XCode-ScreendumpScreendump von XCode

matrix3003
quelle