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

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

655136 次浏览
:%s/\r\+//g

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

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

CtrlM是字符\r或回车,DOS行结尾添加。CtrlV告诉Vim在命令行插入一个文字CtrlM字符。

作为一个整体,此命令将所有\r替换为空,将它们从行的末尾删除。

dos 2unix是一个命令行实用程序,可以执行此操作,如果您使用Ctrl-vCtrl-m输入^M,则:%s/^M//g会执行此操作,或者您可以:set ff=unix和Vim会为您执行此操作。

文件格式设置有留档,Vim wiki有一个全面的页面在线结束转换

或者,如果您经常来回移动文件,您可能不想转换它们,而是执行:set ff=dos,因此Vim将知道它是一个DOS文件并使用DOS约定作为行结尾。

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

使用以下命令:

:%s/^M$//g

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

来自:文件格式

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

我更喜欢使用以下命令:

:set fileformat=unix

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

有关详细信息,请参阅Vim帮助:

:help fileformat

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

更改视图中的行尾:

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

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

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

您可以从命令行使用它:

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

我通常使用

:%s/\r/\r/g

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

通常您可以使用dos2unix命令。只要确保您阅读手册,因为GNU和BSD版本在处理参数的方式上有所不同。

BSD版本:

dos2unix $FILENAME $FILENAME_OUTmv $FILENAME_OUT $FILENAME

GNU版本:

dos2unix $FILENAME

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

function dos2unix(){[ "${!}" ] && [ -f "{$1}" ] || return 1;
{ echo ':set ff=unix';echo ':wq';} | vim "${1}";}

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

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

dos2unix input.txt input.txt

上面使用假设的美国键盘。使用-437选项使用英国键盘。

dos2unix -437 input.txt input.txt

以下步骤可以将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.

参考:文件格式文件格式

tr -d '\15\32' < winfile.txt > unixfile.txt

(见:在Unix和Windows文本文件之间转换

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

我的工作替换命令是

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

在我的屏幕上是这样的:

:%s/^M/\r/g

将文件目录从DOS转换为Unix

使用命令行和ses,找到当前目录中扩展名为“. 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)。

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

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

来自Wikia:

%s/\r\+$//g

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

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

Ctrl+O保存,但在按输入之前,按:Alt+D在DOS和Unix/Linux行结束之间切换,或:Alt+M在Mac和Unix/Linux行结束之间切换,然后按输入保存和Ctrl+X退出。

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

autocmd BufWrite * :set ff=unix

您可以使用:

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

或者dos 2unix实用程序。

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

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

或者写入stdout:

perl -p -e 's/\x0d/\n/g' < excel_created.txt

如果您在记事本中创建一个文件或在Windows中创建记事本++,将其带到Linux,然后通过Vim打开它,您将在每行的末尾看到^M。要删除它,

在您的Linux终端,键入

dos2unix filename.ext

这将是必要的魔法。

我知道我在哪里见过这个。这是FreeBSD登录提示:

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

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

在Vim中,键入:

:w !dos2unix %

这将通过管道将当前缓冲区的内容传输到dos 2unix命令并将结果写入当前内容。Vim将要求重新加载文件。

要直接在Linux控制台中运行:

vim file.txt +"set ff=unix" +wq

在VIM:

:e ++ff=dos | set ff=unix | w!

带VIM的外壳:

vim some_file.txt +'e ++ff=dos | set ff=unix | wq!'

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

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