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

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


当前回答

如果您没有访问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))

(超级用户交叉发布。)

其他回答

这是超级duper容易与PCRE;

作为脚本,或者用文件替换$@。

#!/usr/bin/env bash
perl -pi -e 's/\r\n/\n/g' -- $@

这将覆盖您的文件! 我建议只在备份时这样做(版本控制或其他方式)

我试着

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

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

我不得不思考同样的问题(在windows方面,但同样适用于Linux)。

令人惊讶的是,没有人提到一种非常自动化的方法,使用旧的zip -ll选项(Info-ZIP)对文本文件进行CRLF <-> LF转换:

zip -ll textfiles-lf.zip files-with-crlf-eol.*
unzip textfiles-lf.zip

注意:这将创建一个ZIP文件,保留原始文件名,但将行结束符转换为LF。然后unzip将解压压缩后的文件,即使用它们的原始名称(但使用lf结尾),从而提示覆盖本地原始文件(如果有的话)。

zip——help的相关摘录:

zip --help
...
-l   convert LF to CR LF (-ll CR LF to LF)
sed -i.bak --expression='s/\r\n/\n/g' <file_path>

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

蒂姆托维迪!

perl -pe 's/\r\n/\n/; s/([^\n])\z/$1\n/ if eof' PCfile.txt

根据戈登·戴维森的回答。

人们必须考虑到……的可能性。