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 ...
134
Odpowiedzi:
Windows używa
carriage return
+line feed
dla nowej linii:Unix używa tylko
Line feed
dla nowej linii:Podsumowując, po prostu zastąp każde wystąpienie
\n
przez\r\n
.Oba
unix2dos
idos2unix
nie są domyślnie dostępne w systemie Mac OSX.Na szczęście możesz po prostu użyć
Perl
lubsed
wykonać zadanie:Fragment kodu z:
http://en.wikipedia.org/wiki/Newline#Conversion_utilities
źródło
sed
Poleceń dla systemu UNIX DOS nie działa na mnie na OS X Lion - po prostu wstawia tekst „r” na końcu każdej linii.perl
Komenda działa chociaż.sed
, ale można go obejść bez instalowania Homebrew, gnu-sed lub unix2dos: Użyjsed -e 's/$/^M/' inputfile > outputfile
, gdzie^M
jest znak sterujący wytwarzany w wierszu poleceń przezCtrl+V Ctrl+M
.$
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 .To jest ulepszona wersja odpowiedzi Anne - jeśli używasz perla, możesz dokonać edycji pliku `` w miejscu '' zamiast generować nowy plik:
źródło
Can't do inplace edit on file: Permission denied.
i usunąć plik. Zamiast tego spójrz na inne narzędzia.Możesz zainstalować unix2dos z Homebrew
Następnie możesz to zrobić:
Możesz także konwertować pliki DOS na UNIX:
źródło
dos2unix
. Będziesz chciałbrew install dos2unix
.brew install unix2dos
albobrew install dos2unix
działa dobrze. Instalują ten sam pakiet. Użyj imienia, które do Ciebie przemawia :)port install dos2unix
.Prawdopodobnie chcesz unix2dos :
Możesz uruchomić
unix2dos
na komputerze DOS / Windows za pomocą cygwin lub na komputerze Mac przy użyciu MacPorts .źródło
Po prostu
tr
usuń:źródło
wc -l
).tr
polecenia do wykonywania różnych konwersji. Użyjhexdump
lub podobnie, aby dowiedzieć się, jaki rodzaj konwencji końca linii jest teraz używany w pliku.find ./ -type f -exec dos2unix {} \;
aby rekurencyjnie przekonwertować wszystkie zakończenia linii w bieżącym folderzeźródło
vim
może również konwertować pliki z formatu UNIX do formatu DOS. Na przykład:źródło
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
źródło
Oto naprawdę proste podejście, które dla mnie zadziałało, dzięki uprzejmości Davy Schmeits's Weblog :
Gdzie foo to plik, który ma znaki Control + M na końcu linii, a foo2 to nowy plik, który tworzysz.
źródło
W systemie Yosemite OSX użyj tego polecenia:
gdzie
^M
sekwencję uzyskuje się naciskając Ctrl+ Vnastępnie Enter.źródło
sed
nie rozumieją backslash-ucieka takie jak\r
i `` \ 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żywaniased
(i-i
) do wykonywania tego rodzaju konwersji jest bardzo dobra, ponieważ w przeciwieństwie do tegotr
nie jesteś ograniczony do „jednej postaci na raz”.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:
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
źródło
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 XCode
źródło