Yeni satır biçimlendirmesini Mac'ten Windows'a dönüştürme


133

Mac'te oluşturulan bir .sql döküm dosyasını Windows'ta okunabilir bir dosyaya dönüştürecek bir dönüştürme yardımcı programına / komut dosyasına ihtiyacım var. Bu, benim burada yaşadığım bir sorunun devamı . Sorun, metin dosyalarındaki yeni satır biçimlendirmesiyle ilgili gibi görünüyor, ancak dönüşümü yapacak bir araç bulamıyorum ...


Yanıtlar:


134

Windows, yeni satır için carriage return+ kullanır line feed:

\r\n

Unix yalnızca Line feedyeni satır için kullanır :

\n

Sonuç olarak, her oluşumunu \nby ile değiştirin \r\n.
Hem unix2dosve dos2unixMac OSX üzerinde mevcut varsayılan olarak değil.
Neyse ki, işi yapmak için Perlveya kullanabilirsiniz sed:

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

Kod pasajı:
http://en.wikipedia.org/wiki/Newline#Conversion_utilities


36
sedDOS UNIX için komut OS X Lion benim için işe yaramaz, - bu sadece her satırın sonundaki metin "r" ekler. perlKomut olsa çalışır.
Ergwun

7
OSX, sed'in eski sürümünü kullanır. OSX için Homebrew kullanıyorum ve gnu-sed'i kurdum. "Sed" yerine "gsed" komutuyla kullanırsınız. Bu işe yarıyor.
John

2
Bunun yerine dos2unix ve unix2dos paketlerini almak için Homebrew kullanın.
Pratyush

10
OS X Yosemite hala aynı sorunu sedyaşıyor, ancak Homebrew, gnu-sed veya unix2dos yüklemeden bu sorunu çözebilirsiniz: Kullanın sed -e 's/$/^M/' inputfile > outputfile, ^Mkomut satırında aracılığıyla üretilen bir kontrol karakteri Ctrl+V Ctrl+M.
LarsH

2
Mac OS için başka bir geçici çözüm (10.13.6 High Sierra'da test edilmiştir): $sed komutunu içeren tek tırnağın önüne bir tane yerleştirin: sed $'s/\r$//'Açıklama: bash, $'...'dizelerdeki ters eğik çizgilerin kodunu çözer . Ayrıntılar için gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html adresine bakın.
jcsahnwaldt Monica'yı eski haline getir

127

Bu, Anne'nin cevabının geliştirilmiş bir versiyonudur - eğer perl kullanırsanız, yeni bir dosya oluşturmak yerine 'yerinde' dosya üzerinde düzenleme yapabilirsiniz:

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
Bu komut dosyalarıyla ilgili harika olan şey, normal ifadelerle, herhangi bir şeyden başlayarak herhangi bir formata dönüştürmek için TAM OLARAK satır sonu dönüşümünün ne olması gerektiğini göstermeleridir.
2013

Windows sistemlerinde belirli Cygwin / git bash kurulumlarında buna dikkat edin. Bu size verebilir Can't do inplace edit on file: Permission denied.ve dosyayı silebilir . Bunun yerine diğer yardımcı programlara bakın.
Dennis

"Unix'e Dönüştür" ü gösterdiğiniz için çok teşekkürler. O yolun peşindeydim ve çifte cevabınız bana yardımcı oldu ve oyumu aldım.
null

113

Unix2dos'u Homebrew ile kurabilirsiniz

brew install unix2dos

O zaman bunu yapabilirsiniz:

unix2dos file-to-convert

Ayrıca dos dosyalarını unix'e dönüştürebilirsiniz:

dos2unix file-to-convert

9
Şimdi bununla karşılaşan herkes için, artık Homebrew formülü deniyor dos2unix. Sen isteyeceksin brew install dos2unix.
Geoff

13
Aslında, ya brew install unix2dosda brew install dos2unixiyi çalışıyor. Aynı paketi kurarlar. Size
hitap eden

2
Veya ile MacPorts : port install dos2unix.
Fang

17

Muhtemelen unix2dos istiyorsunuz :

$ 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.

Ya çalıştırabilir unix2doskullanarak DOS / Windows makinede cygwin veya Mac kullanmayla ilgili MacPorts .


Mac'imde unix2dos / dos2unix yok ve bunları kuracak bir yer bulamadım - Biliyor musunuz?
Yarin

@mgadda: +1 - evet, bir süre önce MacPorts'tan homebrew'e geçtim ve arkama bakmadım.
Paul R

15

Sadece trsilin:

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

1
Perl ve sed denedim, işe yaramadı (Bunu çözebilirdim, denemeye değmezdi). Bu harika çalıştı.
RandomInsano

Bu, BBEdit'in satır numaralarının Python kullanarak okurken (ve eşleşmiyor wc -l) satır sayısıyla eşleşmemesi için bulduğum ilk çözümdü .
Daryl Spitzer

1
bu aslında satır sonlarına ihtiyacım olan tüm satır sonlarını siler, ancak \ n
UserYmY

" hints.macworld.com/article.php?story=20031018164326986 " ayrıca trkomutun çeşitli dönüşümleri gerçekleştirmek için nasıl kullanılacağına dair iyi bir yazıya sahiptir . hexdumpDosyada şu anda tam olarak ne tür satır sonu kurallarının kullanıldığını bulmak için veya benzerini kullanın .
Mike Robinson

6
  1. Dos2unix'i homebrew ile kurun
  2. find ./ -type f -exec dos2unix {} \;Geçerli klasördeki tüm satır sonlarını özyinelemeli olarak dönüştürmek için çalıştırın

2

vimayrıca dosyaları UNIX'ten DOS biçimine dönüştürebilir. Örneğin:

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

2

Aşağıdakiler, yukarıdaki yanıtların yanı sıra akıl sağlığı kontrolüne dayanan eksiksiz bir betiktir ve Mac OS X üzerinde çalışır ve diğer Linux / Unix sistemlerinde de çalışmalıdır (ancak bu test edilmemiştir).

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

İşte gerçekten basit bir yaklaşım, benim için iyi çalıştı, Davy Schmeits'in Weblog'u sayesinde :

cat foo | col -b > foo2

Foo, satırın sonunda Control + M karakterlerine sahip olan dosyadır ve foo2 ise oluşturduğunuz yeni dosyadır.


0

Yosemite OSX'te şu komutu kullanın:

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

burada ^Mdizi basılarak gerçekleştirilir Ctrl+ Vo Enter.


Ayrıca sed ,\r "\ n" gibi ters eğik çizgi kaçışlarını anladığını ve bu nedenle bunları değiştirmede de kullanabileceğini unutmayın. Bu karaktere (veya başka bir karaktere) başvurmak için gerçek bir kontrol-M girmeniz gerekmez. Bu türden herhangi bir dönüşümü yapmak için sed(ve -i) kullanma ilkesi çok iyidir, çünkü bunun aksine , "her seferinde bir karakter" ile sınırlı değilsiniz. tr
Mike Robinson

0

Perl'i kısa bir perl betiğinde kullanarak Anne ve JosephH'nin cevaplarını genişletiyorum, çünkü perl-one-liner'ı çok zaman yazmak için çok tembelim.
Örneğin "unix2dos.pl" adlı bir dosya oluşturun ve onu yolunuzdaki bir dizine koyun. Dosyayı 2 satırı içerecek şekilde düzenleyin:

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

Sisteminizde "hangi perl" nin "/ usr / bin / perl" döndürdüğünü varsayarsak. Dosyayı çalıştırılabilir yapın (chmod u + x unix2dos.pl).

Örnek:
$ echo "merhaba"> xxx
$ od -c xxx (dosyanın bir nl ile bitip bitmediğini kontrol eder)
0000000 merhaba \ n

$ unix2dos.pl xxx
$ od -c xxx (şimdi cr
lf'de bitip bitmediğini kontrol eder) 0000000 merhaba \ r \ n


0

Sol paneldeki Xcode 9'da, proje gezgininde dosyanızı açın / seçin . Dosya orada değilse, ilaçla ve proje gezginine bırakın .

Sağ panel bulmak On Metin Ayarlar ve değişim Hattı Endings için Pencereler (CRLF) .

XCode ekran görüntüsüXCode'dan screendump

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.