我需要一个转换实用程序/脚本,它将Mac上生成的.sql转储文件转换为Windows上可读的转储文件。这是我here问题的延续。问题似乎是文本文件中的换行格式,但我找不到进行转换的工具......
答案 0 :(得分:124)
Windows使用carriage return
+ line feed
换行:
\r\n
Unix仅使用Line feed
换行:
\n
总之,只需将\n
的每一次出现都替换为\r\n
默认情况下,Mac OSX上均不提供unix2dos
和dos2unix
幸运的是,您只需使用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
答案 1 :(得分:120)
这是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
答案 2 :(得分:101)
您可以使用Homebrew
安装unix2dosbrew install unix2dos
然后你可以这样做:
unix2dos file-to-convert
您还可以将dos文件转换为unix:
dos2unix file-to-convert
答案 3 :(得分:15)
您可能需要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
,也可以使用MacPorts在Mac上运行。
答案 4 :(得分:13)
只需执行tr
删除:
tr -d "\r" <infile.txt >outfile.txt
答案 5 :(得分:4)
find ./ -type f -exec dos2unix {} \;
以递归方式转换当前文件夹答案 6 :(得分:2)
vim
也可以将文件从UNIX转换为DOS格式。例如:
vim hello.txt <<EOF
:set fileformat=dos
:wq
EOF
答案 7 :(得分:1)
在Yosemite OSX上,使用以下命令:
sed -e 's/^M$//' -i '' filename
通过按 Ctrl + V 然后输入来实现^M
序列。
答案 8 :(得分:1)
以下是基于上述答案的完整脚本以及完整性检查,可在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
答案 9 :(得分:0)
这是一个非常简单的方法,适合我,礼貌Davy Schmeits's Weblog:
cat foo | col -b > foo2
其中foo是在行尾有Control + M字符的文件,foo2是你要创建的新文件。
答案 10 :(得分:0)
扩展Anne和JosephH的答案,使用Perl在一个简短的perl脚本中,因为我太懒了,不能很快地输入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”&gt; XXX
$ od -c xxx(检查文件以nl结尾)
0000000 h e l l o \ n
$ unix2dos.pl xxx
$ od -c xxx(检查它现在以cr lf结束)
0000000 h e l l o \ r \ n
答案 11 :(得分:0)