Konwersja formatowania nowej linii z Maca do Windows

134

Potrzebuję narzędzia / skryptu do konwersji, który skonwertuje plik zrzutu .sql wygenerowany na komputerze Mac na taki, który można odczytać w systemie Windows. To jest kontynuacja problemu, który miałem tutaj . Wydaje się, że problem dotyczy formatowania nowej linii w plikach tekstowych, ale nie mogę znaleźć narzędzia do konwersji ...

Yarin
źródło
3
Ogólne narzędzie, które stworzyłem po tym, jak nie znalazłem żadnego satysfakcjonującego rozwiązania o sile przemysłowej github.com/mdolidon/endlines
Mathias Dolidon

Odpowiedzi:

134

Windows używa carriage return+ line feeddla nowej linii:

\r\n

Unix używa tylko Line feeddla nowej linii:

\n

Podsumowując, po prostu zastąp każde wystąpienie \nprzez \r\n.
Oba unix2dosi dos2unixnie są domyślnie dostępne w systemie Mac OSX.
Na szczęście możesz po prostu użyć Perllub sedwykonać zadanie:

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

Fragment kodu z:
http://en.wikipedia.org/wiki/Newline#Conversion_utilities

Anne
źródło
36
sedPoleceń dla systemu UNIX DOS nie działa na mnie na OS X Lion - po prostu wstawia tekst „r” na końcu każdej linii. perlKomenda działa chociaż.
Ergwun
7
OSX używa starszej wersji seda. Używam Homebrew dla OSX i zainstalowałem gnu-sed. Używasz z poleceniem „gsed” zamiast „sed”. To działa.
John
2
Użyj Homebrew, aby zamiast tego uzyskać pakiety dos2unix i unix2dos.
Pratyush
10
OS X Yosemite nadal ma ten sam problem sed, ale można go obejść bez instalowania Homebrew, gnu-sed lub unix2dos: Użyj sed -e 's/$/^M/' inputfile > outputfile, gdzie ^Mjest znak sterujący wytwarzany w wierszu poleceń przez Ctrl+V Ctrl+M.
LarsH
2
Inne obejście dla Mac OS (testowane na 10.13.6 High Sierra): Umieść a $przed pojedynczym cudzysłowem zawierającym polecenie sed: sed $'s/\r$//'Objaśnienie: bash dekoduje znaki odwrotnego ukośnika w $'...'łańcuchach. Szczegółowe informacje można znaleźć na stronie gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html .
jcsahnwaldt Przywróć Monikę
128

To jest ulepszona wersja odpowiedzi Anne - jeśli używasz perla, możesz dokonać edycji pliku `` w miejscu '' zamiast generować nowy plik:

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
źródło
5
Niesamowitą rzeczą w tych skryptach jest to, że pokazują one, za pomocą wyrażeń regularnych, DOKŁADNIE, czym musi być konwersja końca linii, aby przekonwertować na dowolny format, zaczynając od czegokolwiek.
pbr
uważaj na to w niektórych instalacjach Cygwin / git bash w systemach Windows. To może dać ci Can't do inplace edit on file: Permission denied.i usunąć plik. Zamiast tego spójrz na inne narzędzia.
Dennis,
Wielkie dzięki za pokazanie "Convert to Unix". Szedłem tą drogą, a twoja podwójna odpowiedź pomogła mi i dostałem mój głos za.
null
114

Możesz zainstalować unix2dos z Homebrew

brew install unix2dos

Następnie możesz to zrobić:

unix2dos file-to-convert

Możesz także konwertować pliki DOS na UNIX:

dos2unix file-to-convert
Steven Hirlston
źródło
9
Dla każdego, kto teraz zetknie się z tym, nazywa się teraz formuła Homebrew dos2unix. Będziesz chciał brew install dos2unix.
Geoff
13
Właściwie albo brew install unix2dosalbo brew install dos2unixdziała dobrze. Instalują ten sam pakiet. Użyj imienia, które do Ciebie przemawia :)
Steven Hirlston
2
Lub DarwinPorts : port install dos2unix.
Fang
17

Prawdopodobnie chcesz 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.

Możesz uruchomić unix2dosna komputerze DOS / Windows za pomocą cygwin lub na komputerze Mac przy użyciu MacPorts .

Paul R.
źródło
unix2dos / dos2unix nie istnieją na moim Macu i nie znalazłem miejsca na ich instalację - czy znasz jakieś?
Yarin
@mgadda: +1 - tak, przesiadłem się na homebrew z MacPorts jakiś czas temu i nie oglądałem się za siebie.
Paul R
15

Po prostu trusuń:

tr -d "\r" <infile.txt >outfile.txt
parahren
źródło
1
Wypróbowałem perl i sed, nie działały (mogłem to rozgryźć, nie warto było spróbować). To działało świetnie.
RandomInsano
To było pierwsze rozwiązanie, które znalazłem, aby numery wierszy BBEdit nie pasowały do ​​liczby wierszy, gdy czytałem je za pomocą Pythona (i nie pasowały wc -l).
Daryl Spitzer
1
to usuwa wszystkie podziały wierszy, których właściwie nadal potrzebuję, ale z \ n
UserYmY
hints.macworld.com/article.php?story=20031018164326986 ” zawiera również dobry opis, jak używać tego trpolecenia do wykonywania różnych konwersji. Użyj hexdumplub podobnie, aby dowiedzieć się, jaki rodzaj konwencji końca linii jest teraz używany w pliku.
Mike Robinson
7
  1. Zainstaluj dos2unix z homebrew
  2. Uruchom, find ./ -type f -exec dos2unix {} \;aby rekurencyjnie przekonwertować wszystkie zakończenia linii w bieżącym folderze
AAverin
źródło
2

vimmoże również konwertować pliki z formatu UNIX do formatu DOS. Na przykład:

vim hello.txt <<EOF
:set fileformat=dos
:wq
EOF
Stephen Quan
źródło
2

Poniżej znajduje się kompletny skrypt oparty na powyższych odpowiedziach wraz ze sprawdzaniem poprawności i działa na Mac OS X i powinien działać również na innych systemach Linux / Unix (chociaż nie zostało to przetestowane).

#!/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
źródło
1

Oto naprawdę proste podejście, które dla mnie zadziałało, dzięki uprzejmości Davy Schmeits's Weblog :

cat foo | col -b > foo2

Gdzie foo to plik, który ma znaki Control + M na końcu linii, a foo2 to nowy plik, który tworzysz.

patdevelop
źródło
0

W systemie Yosemite OSX użyj tego polecenia:

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

gdzie ^Msekwencję uzyskuje się naciskając Ctrl+ Vnastępnie Enter.

Olga
źródło
Należy również pamiętać, że sed nie rozumieją backslash-ucieka takie jak \ri `` \ n` i dlatego mogą z nich korzystać również w substytucji. W rzeczywistości nie musisz wprowadzać literału control-M, aby odnieść się do tego znaku (lub jakiegokolwiek innego). Zasada używania sed(i -i) do wykonywania tego rodzaju konwersji jest bardzo dobra, ponieważ w przeciwieństwie do tego trnie jesteś ograniczony do „jednej postaci na raz”.
Mike Robinson
0

Rozszerzając odpowiedzi Anne i JosephH, używając perla w krótkim skrypcie perlowym, ponieważ jestem zbyt leniwy, by pisać perl-one-liner w odpowiednim czasie.
Utwórz plik o nazwie na przykład „unix2dos.pl” i umieść go w katalogu w swojej ścieżce. Edytuj plik tak, aby zawierał 2 wiersze:

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

Zakładając, że „który perl” zwraca „/ usr / bin / perl” w twoim systemie. Spraw, aby plik był wykonywalny (chmod u + x unix2dos.pl).

Przykład:
$ echo "hello"> xxx
$ od -c xxx (sprawdzanie, czy plik kończy się na nl)
0000000 hello \ n

$ unix2dos.pl xxx
$ od -c xxx (sprawdzam, czy teraz kończy się na cr lf)
0000000 witaj \ r \ n

avy
źródło
0

W Xcode 9 w lewym panelu otwórz / wybierz plik w nawigatorze projektu . Jeśli pliku tam nie ma, dodaj go i upuść w nawigatorze projektu .

W prawym panelu znajdź Ustawienia tekstu i zmień zakończenia linii na Windows (CRLF) .

Screendump XCodescreendump z XCode

matrix3003
źródło