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


Answers:


1074

DOS2UNIX的是一个命令行实用工具,将做到这一点,还是:%s/^M//g会如果你使用Ctrl- v Ctrl- m输入^ M,或者你可以:set ff=unix和vim会为你做它。

'fileformat'设置的文档在这里,并且vim Wiki上有关于行尾转换的完整页面

另外,如果您来回移动文件很多,您可能不想转换它们,而是这样做了:set ff=dos,因此vim会知道它是一个DOS文件,并使用DOS约定作为行尾。


56
:%s/^M//g应该为:%s/\r//g,因为^M只是意味着“在行首匹配大写字母“ M””。
Bunyk

78
如果您按照答案说的那样做,并且“使用ctrl-v ctrl-m输入^ M”,则不可以。
pjz

2
crtl-v不好,在Windows上它将剪贴板内容粘贴到命令行。解决方案:%s/\r//g为我工作,@
Bunyk

3
@ropata在Windows上想要的是ctrl-q
鲁芬

2
我一定想念什么,因为set ff=unix什么也没做。也许它可以转换文件,但是所有^M字符仍然存在。
felwithe

276

更改视图中的行尾:

: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

4
非常感谢你。我为像我这样的懒人尝试了vi +':wq ++ ff = unix'<filepath>。
a_secenthusiast

2
这应该是最受欢迎的答案。:w +ff=unix比这里写的大多数其他东西都好得多,bash脚本是一个不错的奖励。
mkasberg

:e在我的Windows vim安装中,这些命令似乎没有执行任何操作。我的视图仍然显示^M代码。
Grant Birchmeier

160

我通常使用

:%s/\r/\r/g

这似乎有点奇怪,但由于vim与换行符匹配的方式而起作用。我也发现它更容易记住:)


9
这在各个平台上都可以一致地工作。最好的答案在这里。
thebigjc 2012年

4
我以前从未遇到过任何问题:set ff=unix,但是我今天打开的文件一定特别奇怪。Vim表示已经,fileformat=unix但是所有行的结尾都是^M。这个解决方案对我有用。
克里斯·B

15
此解决方案为我添加了多余的多余行,使文件中的行数增加了一倍。:%s/\r//g而是为我工作。
维克多·扎曼尼安

3
Victor,您的文件可能以\ r \ n结尾。\ r不是读为换行符,而是\ n。在我遇到的文件中是\ r,您必须添加换行符。
Joeyjoejoejr 2015年

2
@VictorZamanian :%s/\r//g唯一的通用解决方案–特别是对于包含DOS和UNIX风格的换行符的异构混合的混合模式文件。该规范的解决方案(例如:set ff=unix:e ++ff=unix),假设在同一换行符风格当前缓冲区两端的每一行。有时他们这样做;有时他们没有。提示悲伤的表情。
Cecil Curry

97

我更喜欢使用以下命令:

:set fileformat=unix

您还可以使用macdos将文件分别转换为macintosh或MS-DOS / MS-Windows文件约定。如果文件已经采用正确的格式,则不会执行任何操作。

有关更多信息,请参见vim帮助:

:help fileformat

1
在我的Windows vim上,该命令似乎没有任何作用。我的观点仍然存在^M
Grant Birchmeier

添加set fileformat=unix到我的.vimrc文件有效。
乔伊·艾伦

20

:set fileformat=unix 从dos转换为unix。


1
这实际上为我解决了这个问题。我在搜索时找不到那些字符。
Insaneo队长,2015年

20
:%s/\r+//g

在Vim中,这会删除所有回车符,并且仅保留换行符。


2
由于某些原因,以上在Windows gvim下对我不起作用。但是当更改为:%s/\r//g它时,它就像一种魅力。
soltysh 2014年

1
@soltysh:%s / \ r \ + $ // g
thinker3


10

将文件目录从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

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

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

dos2unix input.txt input.txt

上面使用了假定的美式键盘。使用-437选项使用UK键盘。

dos2unix -437 input.txt input.txt



6

使用以下命令:

:%s/^M$//g 

获取^M出现类型CtrlV,然后CtrlMCtrlV告诉Vim接受字面上输入的下一个字符。


6

关于使^ M出现的评论对我有用。在我的vi中仅输入“ ^ M”什么都没有(找不到)。本CTRL+ V CTRL+M序列做到了完美不过。

我的工作替代命令是

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

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

:%s/^M/\r/g

4
您可以使用:%s代替:1,$s%是的简写1,$
Tin Man

5

我发现了一种非常简单的方法:使用nano打开文件: nano file.txt

CTRL+ O保存,但在按之前Enter,按:ALT+ D在DOS和Unix / Linux的行尾之间切换,或:ALT+ M在Mac和Unix / Linux的行尾之间切换,然后按Enter保存和CTRL+ X退出。


在linux服务器上执行此操作,文件^M结尾。另存为dos保留,另存为linux删除。可以检查使用cat -v
HattrickNZ

这个问题是关于vim,而不是nano。
Grant Birchmeier

5
:g/Ctrl-v Ctrl-m/s///

CtrlM\rDOS行尾添加的字符或回车符。CtrlV告诉vim CtrlM在命令行中插入文字字符。

总体而言,此命令将全部替换\r为空,将它们从行尾删除。



3

您可以使用以下命令:
:%s/^V^M//g
其中'^'表示使用CTRL密钥。


2

下面的命令用于重新格式化当前目录中的所有.sh文件,我在Fedora OS上对其进行了测试。

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done

2

在vim中,键入:

:w !dos2unix %

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


2

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


1

通常,dos2unix您可以使用一个命令来执行此操作,只需确保您已阅读该手册,因为GNU和BSD版本在处理参数方面的方式有所不同。

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}";
}

1

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

是否需要从DOS文件中删除所有那些^ M字符?尝试

tr -d \\r < dosfile > newfile
    -- Originally by Dru <genesis@istar.ca>

0

尽管这个话题很老,但我想从Wikia上介绍一下其他内容:

%s/\r\+$//g

该填充查找到行尾的所有回车符(一个或多个代表)并删除,因此\n将停留在eol处。


0

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

autocmd BufWrite * :set ff=unix

0

如果您在Windows的NotePad或NotePad ++中创建文件并将其带到Linux并通过vim打开它,您将在每行末尾看到^ M。要删除它,

在您的Linux终端上,键入

dos2unix filename.ext

这将完成所需的魔术。


0

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

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

或写到标准输出:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.