如何以编程方式(不使用vi)将DOS/Windows换行符转换为Unix换行符?

dos2unix和unix2dos命令在某些系统上不可用。 如何使用sed、awk和tr等命令模拟它们?


当前回答

我试着

sed 's/^M$//' file.txt

在OS X以及其他一些方法(修复Dos行结束或http://hintsforums.macworld.com/archive/index.php/t-125.html)。没有一个工作,文件保持不变(顺便说一下,需要按Ctrl + V, Enter来重新生成^M)。最后我使用了TextWrangler。它不是严格意义上的命令行,但它可以工作,而且不会抱怨。

其他回答

对于Mac OS X,如果您安装了Homebrew (http://brew.sh/):)

brew install dos2unix

for csv in *.csv; do dos2unix -c mac ${csv}; done;

确保您已经复制了文件,因为这个命令将在适当的位置修改文件。 -c mac选项使开关与OS X兼容。

如果您没有访问dos2unix的权限,但是可以阅读这个页面,那么您可以从这里复制/粘贴dos2unix.py。

#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys

if len(sys.argv[1:]) != 2:
  sys.exit(__doc__)

content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
  content = infile.read()
with open(sys.argv[2], 'wb') as output:
  for line in content.splitlines():
    outsize += len(line) + 1
    output.write(line + '\n')

print("Done. Saved %s bytes." % (len(content)-outsize))

(超级用户交叉发布。)

我试着

sed 's/^M$//' file.txt

在OS X以及其他一些方法(修复Dos行结束或http://hintsforums.macworld.com/archive/index.php/t-125.html)。没有一个工作,文件保持不变(顺便说一下,需要按Ctrl + V, Enter来重新生成^M)。最后我使用了TextWrangler。它不是严格意义上的命令行,但它可以工作,而且不会抱怨。

在Linux上,使用sed很容易将^M (Ctrl + M)转换为*nix换行符(^J)。

在CLI中就像这样,文本中会有一个换行符。然而,\将^J传递给sed:

sed 's/^M/\
/g' < ffmpeg.log > new.log

你可以使用^V (Ctrl + V), ^M (Ctrl + M)和\(反斜杠)当你输入:

sed 's/^V^M/\^V^J/g' < ffmpeg.log > new.log
sed -i.bak --expression='s/\r\n/\n/g' <file_path>

因为问题中提到了sed,所以这是使用sed实现此目的的最直接的方法。该表达式表示仅用换行符替换所有换行符和换行符。这就是你从Windows到Unix所需要的。我验证过了。