MacからWindowsへの改行フォーマットの変換


133

Macで生成された.sqlダンプファイルをWindowsで読み取り可能なファイルに変換する変換ユーティリティ/スクリプトが必要です。これは私がここで抱えていた問題の続きです。問題はテキストファイルの改行フォーマットにあるようですが、変換を行うためのツールが見つかりません...


回答:


134

Windowsは改行にcarriage return+ line feedを使用します。

\r\n

UnixはLine feed改行にのみ使用します。

\n

結論としては、単にのすべての出現置き換える\nことによってを\r\n
両方ともunix2dosdos2unixMac OSXではデフォルトでは使用できません。
幸いなことに、あなたは単にPerlまたは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

コードスニペット:http :
//en.wikipedia.org/wiki/Newline#Conversion_utilities


36
sedUNIXからDOSへのコマンドは、OS X Lionでは機能しません-各行の終わりに「r」というテキストを挿入するだけです。perlコマンドはかかわらず動作します。
Ergwun、2012年

7
OSXは古いバージョンのsedを使用します。OSXにはHomebrewを使用し、gnu-sedをインストールしました。「sed」の代わりに「gsed」コマンドを使用します。うまくいきました。
John

2
代わりにHomebrewを使用して、dos2unixおよびunix2dosパッケージを入手してください。
Pratyush

10
OS Xヨセミテはまだ同じ問題を抱えているsedが、あなたは自作、GNU-のsedやunix2dosといったインストールすることなく、それを回避することができます使用sed -e 's/$/^M/' inputfile > outputfile^M制御文字を経由して、コマンドラインで製造されるがCtrl+V Ctrl+M
LarsH 2015年

2
Mac OSの別の回避策(10.13.6 High Sierraでテスト済み):$sedコマンドを含む単一引用符の前にaを配置sed $'s/\r$//'します:説明:bashは、$'...'文字列内のバックスラッシュエスケープをデコードします。詳細については、gnu.org / software / bash / manual / html_node / ANSI_002dC-Quoting.htmlをご覧ください。
jcsahnwaldt Reinstate Monica

127

これは、Anneの回答の改良版です。perlを使用している場合は、新しいファイルを生成するのではなく、「インプレース」でファイルを編集できます。

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
これらのスクリプトのすばらしいところは、正規表現を使用して、何からでも、どちらの形式にも変換するために必要な行末変換を正確に示すことです。
2013年

Windowsシステムの特定のCygwin / git bashインストールでは、これに注意してください。これはあなたを与える可能性がありCan't do inplace edit on file: Permission denied.、および削除ファイルを。代わりに他のユーティリティを調べてください。
デニス

「Unixに変換」をご紹介いただき、誠にありがとうございます。私はその方法の後にいて、あなたの二重の答えが私を助けて、私の賛成を得ました。
2015年

112

あなたはHomebrewで unix2dosをインストールできます

brew install unix2dos

次に、これを行うことができます:

unix2dos file-to-convert

dosファイルをunixに変換することもできます。

dos2unix file-to-convert

9
これに出くわした人のために、Homebrew式はと呼ばれるようになりましたdos2unix。あなたがしたいでしょうbrew install dos2unix
Geoff

13
実際には、どちらbrew install unix2dosかがbrew install dos2unix正常に動作します。彼らは同じパッケージをインストールします。
わかりやすい

2
またはでMacPortsのport install dos2unix
Fang

16

おそらく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.

cygwinunix2dosを使用してDOS / Windowsマシンで実行するか、MacPortsを使用してMacで実行できます。


unix2dos / dos2unixがMacに存在せず、それらをインストールする場所が見つかりませんでした。知っていますか?
Yarin

@mgadda:+1-はい、しばらく前にMacPortsから自作に切り替えましたが、振り返っていません。
ポールR

15

tr削除してください:

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

1
perlを試してsedしましたが、機能しませんでした(私はそれを理解することができたので、試す価値はありませんでした)。これはうまくいきました。
RandomInsano 2014年

これは、Pythonを使用して読み取ったときにBBEditの行番号が行数と一致しない(そしてと一致しないwc -l)ことを発見した最初の解決策でした。
ダリルスピッツァー2014

1
これにより、実際に改行が必要な改行がすべて削除されますが、\ n
UserYmY

hints.macworld.com/article.php?story=20031018164326986」には、trコマンドを使用してさまざまな変換を実行する方法についての説明もあります。使用hexdumpやソートの行末規則は、現在のファイルで使用されている正確に何を見つけるに似て。
マイクロビンソン

6
  1. 自作でdos2unixをインストールする
  2. find ./ -type f -exec dos2unix {} \;現在のフォルダー内のすべての行末を再帰的に変換するために実行します


2

以下は、上記の回答に基づく健全性チェックに基づく完全なスクリプトで、Mac OS Xで動作し、他のLinux / Unixシステムでも動作するはずです(ただし、これはテストされていません)。

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

Davy Schmeitsのウェブログの厚意により、私にとって非常に効果的な、非常にシンプルなアプローチを以下に示します。

cat foo | col -b > foo2

ここで、fooは行末にControl + M文字があるファイルで、foo2は作成する新しいファイルです。


0

Yosemite OSXでは、次のコマンドを使用します。

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

ここで、^MシーケンスはCtrl+ Vを押してからEnter


また、sed \r `` \ n` などのバックスラッシュエスケープを理解しいるため、これらを置換で使用することもできます。実際には、その文字(またはその他)を参照するためにリテラルcontrol-Mを入力する必要はありません。使用する原理sed(と-i行うために)任意のとは違って、ため、この種の変換の一種は、非常に良いものですtr、あなたがそれらに限定されない「一度に一つの文字。」
マイクロビンソン

0

短いperlスクリプトでperlを使用して、AnneとJosephHの答えを拡張します。私は非常に時間をかけてperl-one-linerを入力するのが面倒だからです。
「unix2dos.pl」などの名前のファイルを作成し、パスのディレクトリに配置します。ファイルを編集して2行を含めます。

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

「which perl」がシステム上で「/ usr / bin / perl」を返すと仮定します。ファイルを実行可能にします(chmod u + x unix2dos.pl)。

例:
$ echo "hello"> xxx
$ od -c xxx(ファイルの末尾がnlであることを確認)
0000000 hello \ n

$ unix2dos.pl xxx
$ od -c xxx(cr lfで終了することを確認)
0000000 hello \ r \ n


0

Xcode 9の左側のパネルで、プロジェクトナビゲーターでファイルを開く/選択します。ファイルが存在しない場合は、ドラッグアンドドロップでプロジェクトナビゲーターに挿入します

右側のパネルの検索でテキスト設定と変更行末までのWindows(CRLF)

XCodeスクリーンダンプXCodeからのスクリーンダンプ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.