将换行格式从Mac转换到Windows

我需要一个转换实用程序/脚本,将Mac上生成的.sql转储文件转换为Windows上可读的文件。 这是我在这里遇到的一个问题的延续。 这个问题似乎与文本文件中的换行格式,但我找不到一个工具来进行转换…

Windows使用carriage return +换行换行符:

 \r\n 

Unix只使用换行换行:

 \n 

总之,简单地用\r\n来代替\n的每一次出现。
在Mac OSX上, unix2dosdos2unix都不是默认可用的。
幸运的是,您可以简单地使用Perlsed来完成这项工作:

 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

这是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 

你可以用Homebrew安装unix2dos

 brew install unix2dos 

那么你可以这样做:

 unix2dos file-to-convert 

你也可以把dos文件转换成unix:

 dos2unix file-to-convert 

你可能想要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. 

您可以使用cygwin在DOS / Windows计算机上运行unix2dos ,也可以在Mac上使用MacPorts运行 。

只要做tr删除:

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

在优胜美地OSX上,使用这个命令:

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

^M序列是通过按Ctrl + V然后回车来实现的

  1. 用自制软件安装dos2unix
  2. 运行'find ./ -type f -exec dos2unix {} \;' recursion地转换当前文件夹内的所有行结束符

vim也可以将文件从UNIX转换为DOS格式。 例如:

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

以下是基于上述答案的完整脚本,以及完整性检查,适用于Mac OS X,并且还可以在其他Linux / Unix系统上工作(虽然尚未经过testing)。

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

这是一个非常简单的方法,对我来说很好, Davy Schmeits的博客提供 :

 cat foo | col -b > foo2 

foo是在行尾有Control + M字符的文件,foo2是您创build的新文件。

在安妮和约瑟夫(JosephH)的答案中,用perl脚本使用perl,因为我懒得打出perl-one-liner的时间。
创build一个名为“unix2dos.pl”的文件,并将其放在path中的一个目录中。 编辑文件以包含2行:

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

假设“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(检查它现在结束)
0000000 hello \ r \ n