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

Convert DOS/Windows line endings to Linux line endings in Vim

提问人:Bert Hekman 提问时间:9/17/2008 最后编辑:HenkeBert Hekman 更新时间:10/25/2023 访问量:685978

问:

如果我打开我在 Windows 中创建的文件,这些行都以 .
如何一次删除这些字符?
^M

文件 vim Carriage-Return 换行符

评论

3赞 Yzmir Ramirez 6/8/2019
如果你做了一个,看到那是你的问题。hexdump -C badfile0x0d 0x0a"\r\n"
0赞 Henke 10/28/2022
值得比较 - 什么是 ^M,我该如何摆脱它?

答:

20赞 mercutio 9/17/2008 #1
:%s/\r\+//g

在 Vim 中,它剥离了所有回车符,只留下换行符。

评论

3赞 soltysh 1/23/2014
由于某种原因,上面在 Windows gvim 下对我不起作用。但是当换成它时,它就像一个魅力。:%s/\r//g
2赞 thinker3 7/26/2015
@soltysh :%s/\r\+$//g
4赞 Rob Wells 9/17/2008 #2
:g/Ctrl-v Ctrl-m/s///

CtrlM是 DOS 行尾添加的字符或回车符。 告诉 Vim 在命令行中插入一个文字字符。\rCtrlVCtrlM

从整体上看,此命令将所有内容替换为“无”,并将它们从行尾删除。\r

评论

0赞 Peter Mortensen 8/29/2020
丹尼德的回答中详细说明。
1204赞 pjz 9/17/2008 #3

dos2unix 是一个命令行实用程序,可以做到这一点。

在 Vim 中,如果您使用 - - 输入 ^M(在 Windows 上,请改用 - )。:%s/^M//gCtrlvCtrlmCtrlq Ctrl-m

如果文件以 (Windows) 文件格式加载,Vim 可能不会显示字符。在这种情况下,你可以,然后用 或 保存文件,Vim 会在为你保存文件时重新格式化文件。^Mdos:set ff=unix:w:w!

有关于文件格式设置的文档,Vim wiki 有一个关于行尾转换的综合页面。

或者,如果你经常来回移动文件,你可能不想转换它们,而是这样做,这样 Vim 就会知道它是一个 DOS 文件,并使用 DOS 约定作为行尾。:set ff=dos

评论

71赞 Bunyk 9/12/2013
:%s/^M//g应该是,因为只是表示“匹配行首的大写字母”M”。:%s/\r//g^M
103赞 pjz 9/13/2013
如果您按照答案所说的“使用 ctrl-v ctrl-m 输入 ^M”,则不会。
8赞 roblogic 5/26/2015
crtl-v 不好,在 Windows 上它会将剪贴板内容粘贴到命令行。解决方案对我有用,干杯@Bunyk:%s/\r//g
8赞 ruffin 9/1/2016
@ropata 在 Windows 上您想要的是 ctrl-q
3赞 mwfearnley 3/1/2017
dos2unix 可能是更好的解决方案,但前提是它存在于系统上。我认为我们不应该用它来引导答案。 似乎是最好的答案。set ff=unix
2赞 JayG 9/17/2008 #4

您可以使用以下命令:

其中“^”表示使用键。
:%s/^V^M//gCTRL

5赞 David Webb 9/17/2008 #5

使用以下命令:

:%s/^M$//g

若要显示 ,请键入 ,然后键入 。 告诉 Vim 按字面意思输入下一个字符。^MCtrlVCtrlMCtrlV

15赞 Alex Gartrell 9/17/2008 #6

发件人:文件格式

[Esc] :%s/\r$//

评论

0赞 the Tin Man 1/8/2013
+1 用于指向官方文档网站。对于使用上述链接的任何人,请参阅该页面上的“转换当前文件”部分。
0赞 Jan Molak 11/4/2014
这个 + vim -b <文件名>就像一个魅力,谢谢,+1
0赞 Peter Mortensen 8/29/2020
链接已断开一半。它会重定向到另一个页面。
135赞 Sylvain Defresne 9/17/2008 #7

我更喜欢使用以下命令:

:set fileformat=unix

您还可以使用或分别将文件转换为 Mac 或 MS-DOS/Windows 文件约定。如果文件已经采用正确的格式,它什么都不做。macdos

有关更多信息,请参阅 Vim 帮助:

:help fileformat

评论

2赞 Grant Birchmeier 6/21/2017
此命令似乎在我的 Windows vim 上没有执行任何操作。我的观点仍然有字符。^M
0赞 Joey Allen 10/8/2017
添加到我的 .vimrc 文件有效。set fileformat=unix
22赞 Martin Sj&#246;gren 9/17/2008 #8

:set fileformat=unix从 DOS 转换为 Unix。

评论

2赞 Captain Insaneo 8/5/2015
这实际上为我解决了这个问题。我在搜索时找不到这些字符。
327赞 Ludvig A. Norin 9/19/2008 #9

更改视图中的行尾:

: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赞 a_secenthusiast 5/22/2016
谢谢。我为像我这样的懒惰的人尝试了 vi +':wq ++ff=unix' <filepath>。
4赞 mkasberg 6/18/2017
这应该是投票最多的答案。 比这里写的大多数其他东西要好得多,而且 bash 脚本是一个很好的奖励。:w +ff=unix
1赞 Grant Birchmeier 6/21/2017
这些命令似乎在我的 Windows vim 安装上没有做任何事情。我的视图仍然显示代码。:e^M
0赞 Olivier Pons 12/6/2020
我到处阅读,但对我来说最简单的方法是退出并重新打开文件。:e ++ff=unix:w ++ff=unix
0赞 Victor Zamanian 1/8/2021
@OlivierPons但是:e与重新打开文件做同样的事情吗?在解决方案中添加更多不必要的步骤如何使其更简单?
177赞 t-dub 7/30/2009 #10

我通常使用

:%s/\r/\r/g

这看起来有点奇怪,但由于 Vim 匹配换行的方式而有效。我也发现更容易记住:)

评论

11赞 thebigjc 6/23/2012
这在各个平台上都是一致的。这里最好的答案。
4赞 Chris B 3/21/2013
我以前从未遇到过任何问题,但是我今天打开的文件一定特别奇怪。Vim 说它已经是,但所有的行尾都是 .这个解决方案对我有用。:set ff=unixfileformat=unix^M
19赞 Victor Zamanian 8/23/2013
这个解决方案为我添加了不需要的额外行,使文件中的行数增加了一倍。 反而对我有用。:%s/\r//g
3赞 Joeyjoejoejr 2/13/2015
Victor,您的文件可能有 \r\n 结尾。\r 不读作换行符,但 \n 读作换行符。在我遇到的文件中是\r,您必须添加一个换行符。
5赞 Cecil Curry 9/28/2019
@VictorZamanian是唯一的通用解决方案,特别是对于包含 DOS 和 UNIX 样式换行符的异构混合的混合模式文件。规范解(例如,,)假定当前缓冲区的每一行都以相同的换行符样式结束。有时他们会这样做;有时他们没有。提示悲伤的脸。:%s/\r//g:set ff=unix:e ++ff=unix
-1赞 dsm 7/30/2009 #11

通常有一个命令可用于此目的。只要确保你阅读了手册,因为GNU和BSD版本在处理参数的方式上有所不同。dos2unix

BSD 版本:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

GNU 版本:

dos2unix $FILENAME

或者,您可以使用此处的任何建议答案创建自己的答案,例如:dos2unix

function dos2unix(){
    [ "${!}" ] && [ -f "{$1}" ] || return 1;

    { echo ':set ff=unix';
      echo ':wq';
    } | vim "${1}";
}
8赞 Venkataramesh Kommoju 12/15/2009 #12

dos2unix可以直接修改文件内容。

您可以直接在文件上使用它,而无需任何临时文件重定向。

dos2unix input.txt input.txt

以上使用假定的美式键盘。使用选项以使用英国键盘。-437

dos2unix -437 input.txt input.txt
7赞 ajitomatix 2/18/2012 #13

以下步骤可以将DOS的文件格式转换为Unix:

:e ++ff=dos     Edit file again, using dos file format ('fileformats' is ignored).[A 1]
:setlocal ff=unix     This buffer will use LF-only line endings when written.[A 2]
:w     Write buffer using Unix (LF-only) line endings.

参考:文件格式

评论

0赞 Peter Mortensen 8/29/2020
链接已断开一半。它会重定向到另一个页面。
9赞 Michael Douma 5/24/2012 #14
tr -d '\15\32' < winfile.txt > unixfile.txt

(请参阅:在 Unix 和 Windows 文本文件之间转换)

5赞 Dannid 7/14/2012 #15

关于让 ^M 出现的评论对我有用。仅仅在我的 vi 中输入“^M”一无所获(未找到)。不过,+ + 序列完美地做到了这一点。CTRLVCTRLM

我的工作替换命令是

:%s/Ctrl-V Ctrl-M/\r/g

它在我的屏幕上看起来像这样:

:%s/^M/\r/g
9赞 Sparkida 1/2/2014 #16

将文件目录从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 = +(不要只键入插入符号“^”符号和 M)。Ctrl+VCtrl+M

1赞 user3220487 2/13/2015 #17

以下命令用于重新格式化当前目录中的所有 .sh 文件。我在我的 Fedora OS 上测试了它。

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done
0赞 loadaverage 2/9/2016 #18

来自Wikia:

%s/\r\+$//g

这将找到所有回车标志(一个或多个重复)直到行尾并删除,因此将停留在 EOL。\n

6赞 Stefan Sjöberg 5/1/2016 #19

我找到了一个非常简单的方法:用nano打开文件:nano file.txt

按 + 保存,但在按 之前,按:+ 在 DOS 和 Unix/Linux 行尾之间切换,或按:+ 在 Mac 和 Unix/Linux 行尾之间切换,然后按保存和 + 退出。CtrlOEnterAltDAltMEnterCtrlX

评论

0赞 HattrickNZ 5/12/2016
在 Linux 服务器上完成此操作,文件有结尾。另存为 DOS 以保留,另存为 Linux 以删除。可以使用^Mcat -v
2赞 Grant Birchmeier 6/21/2017
这个问题是关于 vim 的,而不是 nano。
0赞 Thomas PABST 6/8/2016 #20

这是我的方式。我在DOS EOL中打开了一个文件,当我保存文件时,它将自动转换为Unix EOL:

autocmd BufWrite * :set ff=unix
2赞 Christy Wald 12/15/2016 #21

您可以使用:

vim somefile.txt +"%s/\r/\r/g" +wq

或者 dos2unix 实用程序。

0赞 user3379574 2/11/2017 #22

我想要换行符代替 ^M。Perl 来救援:

perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt

或者写信给 stdout:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
-1赞 Santle Camilus 8/24/2017 #23

如果你在 Windows 的记事本或 Notepad++ 中创建一个文件,把它带到 Linux,然后用 Vim 打开它,你会在每行的末尾看到 ^M。要删除它,

在 Linux 终端上,键入

dos2unix filename.ext

这将发挥所需的魔力。

评论

0赞 Peter Mortensen 8/30/2020
默认情况下,dos2unix 未安装在 Ubuntu 20.04 (Focal Fossa) 上。
0赞 Matthew Read 5/13/2023
更老的答案已经详细介绍了这个解决方案。
0赞 Albaro Pereyra 10/25/2017 #24

我知道我在某个地方见过这个。以下是 FreeBSD 的登录提示:

您需要从 DOS 文件中删除所有这些 ^M 字符吗?尝试

tr -d \\r < dosfile > newfile
    -- Originally by Dru <[email protected]>
2赞 Tallak Tveide 1/17/2018 #25

在 Vim 中,键入:

:w !dos2unix %

这会将当前缓冲区的内容通过管道传递给 dos2unix 命令,并将结果写入当前内容。Vim 会要求在之后重新加载文件。

9赞 CBuzatu 10/17/2018 #26

要直接在 Linux 控制台中运行,请执行以下操作:

vim file.txt +"set ff=unix" +wq
21赞 Victor S. 12/3/2020 #27

在 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赞 Paul Danelli 4/20/2023
谢谢。我设法将文件转换为错误的格式,并且无法使用 Git 撤消它。这很有效。
0赞 chipfall 1/3/2023 #28

这比您要求的要多一点,但是:

nmap <C-d> :call range(line('w0'),line('w$'))->map({_,v-> getline(v)})->map({_,v->trim(v,join(map(range(1,0x1F)+[0xa0],{n->n->nr2char()}),''),2)})->map({k,v->setline(k+1,v)})<CR>

运行它,不再需要 unix2dos。:set ff=unix|dos

  • trim() 的单个 arg 形式具有相同的默认掩码,加上 0X20(实际空格)而不是 0x1F
  • 该默认掩码会清除所有非打印字符,包括难以找到的不间断空格 [0xa0]
  • 从线条范围创建线列表
  • 使用与源相同的掩码代码将该列表映射到 trim 函数,减少空格
  • 再次将其映射到 setline 以替换线。
  • 此时所要做的就是选择使用哪个 EOL 来保存它,DOS 或 Unix:set fileformat=
  • 如果您想消除或添加一些字符,更改上面的字符范围应该很容易
0赞 Vittore Marcas 4/19/2023 #29

要一次性删除这些行尾字符,无论它们在行中的哪个位置出现(如果两行仅用 a 分隔,则这不是一个好主意,因为命令将行连接在一起):DOS/WindowsCR

:%s/\r//g

参考:文件格式 -> 6.删除不需要的 CR 或 LF 字符

但是,您可以选择将这些行尾转换为 。DOS/WindowsUnix

这意味着,要从任何行尾的混合转换当前文件,因此所有行都仅以以下结尾:CRLF/LF-onlyLF

:update              Save any changes. 
:e ++ff=dos          Edit file again, using dos file format ('fileformats' is ignored).
:setlocal ff=unix    This buffer will use LF-only line endings when written.
:w                   Write buffer using unix (LF-only) line endings. 

参考:文件格式 -> 3.转换当前文件

在上面的上下文中,替换 with 将写入带有 mac () 行尾的文件。或者,如果它一开始就是 mac 文件,则可以使用正确读取文件,以便将行尾转换为 或 。:set ff=unix:set ff=macCR-only:e ++ff=macunixdos

更多参考资料:

1.配置行分隔符 -> 更改当前文件(IntelliJ IDEA)的行分隔符

2.配置行分隔符 -> 为新文件配置行分隔符(IntelliJ IDEA)。

3.Vim Tips Wiki -> 文件格式