文档中CRLF和LF之间的转换

在 Windows 和 Linux 之间“反复横跳”的我,不可避免地遇到了换行符之间转换的问题。

到网上查了一下,方法有很多,在这里整理一下,顺便加深一下对一些基础功能的认识。

问题产生原因

在 Windows 中,换行符是 \r\n,而在 Unix 中,换行符是 \n。在 Mac 中则是 \r。有点佩服用多台电脑的大佬们了。在 Unix 中打开包含 \r 的文件,\r 会变成可视化字符 ^M。最大的问题其实不是单个文件的转换而是文件夹下的批量转换。

DOS 2 Unix

Windows

根据1,最简单的办法是用 git-windows 自带的 dos2unix.exe。

基础用法是:

1
dos2unix yourfile

批量操作可以是:

1
find . -type f -exec dos2unix {} \;

PS:一般的 Linux 发行版都带有 dos2unix 这个小工具,如果没有的话也可以在软件源中下载到。

Unix

sed

命令 sed 有很多种玩法。根据2可以这样:

1
2
3
sed -i 's/^M$//g'
sed -i 's/\r$//g'
sed ‘s/.$//’dosfile.txt > unixfile.txt

上面的是基础操作,接下来我们对文件进行批量操作。

find

1
find . -name "*.*" | xargs sed -i 's/\r$//g'

perl

1
perl -p -e ‘s/\r$//’< dosfile.txt > unixfile.txt

关于 git

在 git 中有一个自动转换换行符的功能,在文件 commit 的时候会自动转换换行符格式。详细内容可以参考 git 的文档。推荐配置为

1
git config --global core.autocrlf input

这样会在Windows系统上的签出文件中保留CRLF,会在Mac和Linux系统上,包括仓库中保留LF。

Unix 2 DOS

既然有 dos2unix,当然也有 unix2dos 啦

Windows

Unix

sed

1
2
sed -i 's/$/\r\n/' 
sed ’s/$/\r/’unixfile.txt > dosfile.txt

在该脚本中,’$’ 规则表达式将与行的末尾匹配,而 ‘\r’ 告诉 sed 在其之前插入一个回车。在换行之前插入回车,每一行就以 CR/LF 结束。 ——引自2

1
sed -i 's/$/\r/g' `grep '$' -rl .`

楼上的强化版,批量转换。

perl

1
perl -p -e ‘s/$/\r/’< unixfile.txt > dosfile.txt

其他

2中也有用 vim 转换的操作,这个也应该记一下。

vim 是一个 vi 的改进版本,可以运行在 Windows 和 Linux 平台上,使用方法如下:
DOS 转 UNIX::setfileformat=unix
UNIX 转 DOS::setfileformat=dos
你也可以使用 ff 来替代 fileformat
注:为了能让 vim 可以自动识别 DOS 和 UNIX 文本文件格式,可以在 .vimrc(Linux) 或 _vimrc(Windows)配置文件中加入如下一行设置:

1
2
> setfileformats=dos,unix
>

设置完成后,使用 vim 打开 DOS 文本文件就不会显示 ^M 字符了。

结语

作为一名菜鸡,随着 WSL 版本的更新的确感觉它越来越好用了,Windows 或成为最好用的 Linux 发行版说不定哪一天就成为现实了呢,摊手。虽然个人并不希望有那一天啦。

备注

1. vscode如何替换所有文件的回车格式为LF呢?
2. 批量将目录下所有文件进行 dos/unix 格式转换
文章作者: 40m41h42t
文章链接: http://qrzbing.cn/2019/02/20/CRLF-to-LF/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 QRZ's Blog