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

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


当前回答

一个更简单的没有程序的AWK解决方案:

awk -v ORS='\r\n' '1' unix.txt > dos.txt

从技术上讲,“1”是您的程序,因为AWK在给定选项时需要一个。

或者,内部解决方案是:

while IFS= read -r line;
do printf '%s\n' "${line%$'\r'}";
done < dos.txt > unix.txt

其他回答

我不得不思考同样的问题(在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)

你可以通过option -c {command}以编程方式使用Vim:

DOS到Unix:

vim file.txt -c "set ff=unix" -c ":wq"

Unix到DOS:

vim file.txt -c "set ff=dos" -c ":wq"

“set ff=unix/dos”表示将文件的fileformat (ff)更改为unix/dos的行尾格式。

":wq"表示将文件写入磁盘并退出编辑器(允许在循环中使用该命令)。

使用AWK你可以做到:

awk '{ sub("\r$", ""); print }' dos.txt > unix.txt

使用Perl你可以做到:

perl -pe 's/\r$//' < dos.txt > unix.txt

安装dos2unix,然后就地转换文件

dos2unix <filename>

将转换后的文本输出到不同的文件使用

dos2unix -n <input-file> <output-file>

你可以在Ubuntu或Debian上安装它

sudo apt install dos2unix

或者在macOS上使用Homebrew

brew install dos2unix

蒂姆托维迪!

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

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

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