在Vim中将DOS/Windows行结尾转换为Linux行结尾

820

如果我打开在Windows上创建的文件,所有行都以^M结尾。
如何一次性删除这些字符?


3
如果你使用命令 hexdump -C badfile 并且看到了 0x0d 0x0a,也就是 "\r\n",那就是你的问题所在。需要修复这个问题。 - Yzmir Ramirez
值得比较的 - 什么是 ^M,如何去除它? - Henke
29个回答

1204
dos2unix 是一个命令行实用程序,可以完成这个任务。
在Vim中,使用Ctrl-v Ctrl-m输入^M(在Windows上,使用Ctrl-q Ctrl-m代替)可以执行:%s/^M//g
如果使用dos(Windows)文件格式加载文件,Vim可能不会显示^M字符。在这种情况下,您可以使用:set ff=unix命令,然后使用:w:w!保存文件,Vim会在保存文件时重新格式化它。
关于fileformat设置有相关文档,Vim维基上有一篇详尽的关于行尾转换的页面
如果你经常来回移动文件,你可能不想将它们转换,而是使用:set ff=dos命令,这样Vim就会知道它是一个DOS文件,并使用DOS约定的行尾符。

71
应该将 :%s/^M//g 改成 :%s/\r//g,因为 ^M 只是代表在行首匹配大写字母"M",而 \r 才是回车符的转义字符。 - Bunyk
103
如果你按照答案所说,使用“ctrl-v ctrl-m”输入'^M',那么就不会出现这种情况。 - pjz
8
“Ctrl+V”在Windows中不能起到复制的作用,而是会将剪贴板内容粘贴到命令行中。解决方法是使用“:%s/\r//g”命令。感谢@Bunyk提供的帮助。 - roblogic
8
你在Windows想要的是[ctrl-q](https://dev59.com/3XRC5IYBdhLWcg3wCMrX#426910)。 - ruffin
3
dos2unix 可能是更好的解决方案,但仅当它在系统上存在时才是如此。我认为我们不应该以此为答案。set ff=unix 似乎是最好的答案。 - mwfearnley
显示剩余11条评论

327

更改视图中的行尾:

:e ++ff=dos
:e ++ff=mac
:e ++ff=unix

这也可以作为保存操作使用(:w单独使用将不会使用您在屏幕上看到的行结束符):

:w ++ff=dos
:w ++ff=mac
:w ++ff=unix

你可以从命令行使用它:

for file in *.cpp
do 
    vi +':w ++ff=unix' +':q' "$file"
done

5
非常感谢。我尝试了 vi +':wq ++ff=unix' <filepath>,对于像我这样的懒人来说非常方便。 - a_secenthusiast
4
这应该是最受欢迎的回答。:w +ff=unix 比这里大部分其他写法都要好得多,而且 bash 脚本也是一个不错的加分项。 - mkasberg
1
我的 Windows vim 安装中似乎没有任何操作可以执行“:e”命令。我的视图仍然显示“^M”代码。 - Grant Birchmeier
我在各处都看到了 :e ++ff=unix,但对我最简单有效的方法是使用 :w ++ff=unix 然后退出并重新打开文件。 - Olivier Pons
@OlivierPons 但是,使用:e命令与重新打开文件有什么区别?在解决方案中添加更多不必要的步骤如何使其更简单? - Victor Zamanian
在视图中更改行尾并不能实现他要求的去除^M的功能。 - user1708042

177

我通常使用

:%s/\r/\r/g

这似乎有点奇怪,但是由于Vim匹配换行符的方式而起作用。我也觉得更容易记住 :)


11
这在各个平台上都能稳定地运行。这是最好的答案。 - thebigjc
4
以前我从来没有用过:set ff=unix出现任何问题,但我今天打开的那个文件可能特别奇怪。Vim显示它已经是fileformat=unix,但所有行的结尾都是^M。这个解决方案对我有用。 - Chris B
18
这个解决方案对我来说会添加多余的额外行,文件中的行数会增加一倍。:%s/\r//g适用于我。 - Victor Zamanian
3
Victor,你的文件可能带有\r\n结尾。其中\r不被视为换行符,但\n是。在我处理的文件中存在\r,你需要添加一个换行符。 - Joeyjoejoejr
4
@VictorZamanian的:%s/\r//g是唯一一个适用于包含混合DOS和UNIX风格换行符的文件的通用解决方案。典型的解决方案(例如:set ff=unix:e ++ff=unix)假设当前缓冲区的每一行都以相同的换行符样式结束。有时候是这样的;有时候不是。* Cue sadface.* - Cecil Curry
显示剩余6条评论

135

我更喜欢使用以下命令:

:set fileformat=unix

你也可以使用macdos分别将文件转换为Mac或MS-DOS/Windows文件格式。如果文件已经在正确的格式下,则不会进行任何操作。

更多信息请参阅Vim帮助:

:help fileformat

2
这个命令在我的Windows vim上似乎没有任何作用。 我的视图仍然有“^M”字符。 - Grant Birchmeier
将“set fileformat=unix”添加到我的.vimrc文件中起作用了。 - Joey Allen

22

:set fileformat=unix 用于将 DOS 转换为 Unix。


2
这对我来说实际上解决了问题。在搜索时我找不到那些字符。 - Captain Insaneo

21
在VIM中:
:e ++ff=dos | set ff=unix | w!
在使用VIM的Shell中:
vim some_file.txt +'e ++ff=dos | set ff=unix | wq!'

e ++ff=dos - 强制以 dos 格式打开文件。

set ff=unix - 将文件转换为 unix 格式。


1
谢谢。我设法将一个文件转换成了错误的格式,无法使用Git撤销。这个方法完美地解决了问题。 - Paul Danelli

20
:%s/\r\+//g
在Vim中,它会去除所有的回车符并只保留换行符。

3
由于某些原因,上述方法在Windows的gvim下无法正常使用。但是,当改为使用 :%s/\r//g 后,它能够完美运行。 - soltysh
2
@soltysh :%s/\r+$//g - thinker3

15

+1 指向官方文档网站。对于使用上述链接的任何人,请查看该页面上的“转换当前文件”部分。 - the Tin Man
这个命令 + vim -b <文件名> 真是太好用了,谢谢,+1 - Jan Molak
链接有点损坏,它会重定向到另一个页面。 - Peter Mortensen

9

将文件夹从DOS格式转换为Unix格式

使用命令行和sed,在当前目录中查找所有扩展名为“.ext”的文件,并删除所有的"^M"

@ https://gist.github.com/sparkida/7773170

find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;

另外,正如之前的回答中提到的,^M = Ctrl+V + Ctrl+M(不要只输入脱字符“^”和字母“M”)。


9
在Linux控制台中直接运行:
vim file.txt +"set ff=unix" +wq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接