将换行格式从Mac转换为Windows


133

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


3
在找不到具有工业强度的令人满意的解决方案后,我制作了一个通用工具github.com/mdolidon/endlines
Mathias Dolidon,2015年

Answers:


134

Windows 对换行符使用carriage return+ line feed

\r\n

Unix仅Line feed用于换行符:

\n

总之,只需更换的每一次出现\n\r\n
两者unix2dosdos2unix没有通过在Mac OSX上可用的默认值。
幸运的是,您可以简单地使用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


36
sedUNIX到DOS 的命令在OS X Lion上对我不起作用-它仅在每行的末尾插入文本“ r”。该perl命令虽然有效。
Ergwun 2012年

7
OSX使用旧版本的sed。我将Homebrew用于OSX,并安装了gnu-sed。您可以使用“ gsed”命令而不是“ sed”。这样可行。
约翰

2
使用Homebrew来获取dos2unix和unix2dos软件包。
Pratyush

10
OS X Yosemite仍然存在相同的问题sed,但是您可以在不安装Homebrew,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恢复莫妮卡

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
这些脚本的妙处在于,它们使用正则表达式显示了从任何内容开始到转换成两种格式所需的行尾转换。
pbr

在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

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.

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


unix2dos / dos2unix在我的Mac上不存在,我还没有找到安装它们的位置-您知道吗?
Yarin

@mgadda:+1-是的,我前一段时间从MacPorts切换到自制软件,并且没有回头。
Paul R

15

只需tr删除:

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

1
尝试过perl和sed,没有用(我本可以弄清楚,不值得尝试)。这很棒。
RandomInsano 2014年

这是我发现的第一个解决方案,即BBEdit的行号与使用Python读取的行数不匹配(并且不匹配wc -l)。
Daryl Spitzer 2014年

1
这会删除所有换行符,但实际上我仍然需要换行符,但是\ n
UserYmY 2015年

hints.macworld.com/article.php?story=20031018164326986 ”也很好地记录了如何使用tr命令执行各种转换。使用hexdump或类似方法找出文件中现在使用的行尾约定的确切类型。
Mike Robinson

6
  1. 使用自制软件安装dos2unix
  2. 运行find ./ -type f -exec dos2unix {} \;以递归方式转换当前文件夹中的所有行尾

2

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

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

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的Weblog提供

cat foo | col -b > foo2

其中foo是该行末尾具有Control + M字符的文件,而foo2是您要创建的新文件。


0

在优胜美地OSX上,使用以下命令:

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

其中^M序列通过按压来实现Ctrl+ V然后Enter


还请注意,sed 它确实了解反斜杠转义,例如\r和``\ n`,因此也可以在替换中使用它们。您实际上不必输入文字控件M来引用该字符(或任何其他字符)。使用sed(和-i)进行任何类型的转换的原理是一个很好的原理,因为与不同tr,您不限于“一次一个字符”。
Mike Robinson

0

在简短的perl脚本中使用perl扩展了Anne和JosephH的答案,因为我太懒了以至于无法立即输入perl-one-liner。
创建一个文件,例如“ unix2dos.pl”,并将其放在路径中的目录中。编辑文件以包含两行:

#!/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(检查它现在以cr lf结尾)
0000000 hello \ r \ n


0

在左侧面板的Xcode 9中,在项目导航器中打开/选择文件。如果文件不存在,则将其拖放到项目导航器中

在右侧面板上找到“ 文本设置”,然后将“ 行尾更改为Windows(CRLF)

XCode屏幕转储XCode的screendump

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.