ChatGPT解决这个技术问题 Extra ChatGPT

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

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

如果您执行 hexdump -C badfile 并看到 0x0d 0x0a "\r\n",那就是您的问题。

p
pjz

dos2unix 是一个命令行实用程序,如果您使用 Ctrl-v Ctrl-m,:%s/^M//g 将执行此操作 输入 ^M,或者你可以 :set ff=unix 并且 Vim 会为你做。

有关于 fileformat 设置的文档,Vim wiki 有一个全面的 page on line ending conversions

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


:%s/^M//g 应该是 :%s/\r//g,因为 ^M 只是表示“匹配行首的大写“M””。
如果你按照答案说的那样做,并“使用 ctrl-v ctrl-m 输入 ^M”,则不会。
crtl-v 不好,在 Windows 上它将剪贴板内容粘贴到命令行。解决方案 :%s/\r//g 对我有用,干杯 @Bunyk
@ropata 您在 Windows 上想要的是 ctrl-q
我一定错过了什么,因为 set ff=unix 什么都不做。也许它会转换文件,但所有 ^M 字符仍然存在。
m
melpomene

更改视图中的行尾:

: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

非常感谢。我为像我这样的懒人尝试了 vi +':wq ++ff=unix'
这应该是最受好评的答案。 :w +ff=unix 比这里写的大多数其他东西要好得多,bash 脚本是一个不错的奖励。
:e 命令在我的 Windows vim 安装中似乎没有任何作用。我的视图仍然显示 ^M 代码。
我到处阅读 :e ++ff=unix,但对我来说最简单的工作是 :w ++ff=unix 然后退出 &重新打开文件。
@OlivierPons 但是 :e 与重新打开文件做同样的事情吗?在您的解决方案中添加更多不必要的步骤如何使其更简单?
P
Peter Mortensen

我通常使用

:%s/\r/\r/g

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


这在平台上始终如一。最好的答案在这里。
我以前从未遇到过 :set ff=unix 的任何问题,但我今天打开的文件一定特别奇怪。 Vim 说它已经是 fileformat=unix 但所有的行尾都是 ^M。这个解决方案对我有用。
此解决方案为我添加了不需要的额外行,使文件中的行数增加了一倍。 :%s/\r//g 反而对我有用。
维克多,你的文件可能有 \r\n 结尾。 \r 不被读取为换行符,但 \n 是。在我遇到的文件中是 \r ,你必须添加一个换行符。
@VictorZamanian 的 :%s/\r//g唯一的通用解决方案——特别是对于包含 DOS 和 UNIX 样式换行符的异构混合的混合模式文件。规范解决方案(例如,:set ff=unix:e ++ff=unix)假设当前缓冲区的每一行都以相同的换行样式结束。有时他们会这样做;有时他们不会。 提示悲伤的表情。
P
Peter Mortensen

我更喜欢使用以下命令:

:set fileformat=unix

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

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

:help fileformat

这个命令在我的 Windows vim 上似乎没有做任何事情。我的视图中仍然有 ^M 个字符。
set fileformat=unix 添加到我的 .vimrc 文件中有效。
P
Peter Mortensen

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


这实际上为我解决了这个问题。我在搜索时找不到这些字符。
G
George Sovetov
:%s/\r\+//g

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


出于某种原因,在 Windows gvim 下上面对我不起作用。但是当更改为 :%s/\r//g 时,它就像一个魅力。
@soltysh :%s/\r\+$//g
P
Peter Mortensen

来自:File format

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


+1 指向官方文档网站。对于使用上述链接的任何人,请参阅该页面上的“转换当前文件”部分。
这 + vim -b 就像一个魅力,谢谢,+1
链接断了一半。它重定向到另一个页面。
V
Victor S.

在 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 格式。


P
Peter Mortensen

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

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

dos2unix input.txt input.txt

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

dos2unix -437 input.txt input.txt

P
Peter Mortensen

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


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

(参见:Convert between Unix and Windows text files


P
Peter Mortensen

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

参考:File format


链接断了一半。它重定向到另一个页面。
P
Peter Mortensen

直接在 Linux 控制台中运行:

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

P
Peter Mortensen

我找到了一个非常简单的方法:使用 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 检查
这个问题是关于vim,而不是nano。
D
Dannid

关于让 ^M 出现的评论对我有用。仅在我的 vi 中键入“^M”一无所获(未找到)。 CTRL+V CTRL+M 序列虽然做得很完美。

我的工作替换命令是

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

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

:%s/^M/\r/g

P
Peter Mortensen

使用以下命令:

:%s/^M$//g

要显示 ^M,请键入 CtrlV,然后键入 CtrlMCtrlV 告诉 Vim 直接输入下一个字符。


P
Peter Mortensen
:g/Ctrl-v Ctrl-m/s///

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

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


Dannid's answer 中详细说明。
P
Peter Mortensen

您可以使用:

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

dos2unix 实用程序。


M
Mwiza

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


P
Peter Mortensen

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

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

P
Peter Mortensen

在 Vim 中,键入:

:w !dos2unix %

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


T
The Unfun Cat

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

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

或写入标准输出:

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

P
Peter Mortensen

通常有一个 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}";
}

P
Peter Mortensen

来自维基:

%s/\r\+$//g

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


P
Peter Mortensen

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

autocmd BufWrite * :set ff=unix

P
Peter Mortensen

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

在您的 Linux 终端上,键入

dos2unix filename.ext

这将发挥所需的魔力。


dos2unix 默认情况下未安装在例如 Ubuntu 20.04(Focal Fossa)上。
P
Peter Mortensen

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

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

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