785

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

4

27 回答 27

1160

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

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

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

于 2008-09-17T12:45:38.567 回答
312

更改视图中的行尾:

: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
于 2008-09-18T18:53:17.423 回答
172

我通常使用

:%s/\r/\r/g

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

于 2009-07-30T01:17:35.443 回答
112

我更喜欢使用以下命令:

:set fileformat=unix

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

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

:help fileformat
于 2008-09-17T12:51:31.983 回答
21

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

于 2008-09-17T12:52:08.910 回答
20
:%s/\r\+//g

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

于 2008-09-17T12:45:24.680 回答
14

来自:文件格式

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

于 2008-09-17T12:49:28.510 回答
9

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

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

dos2unix input.txt input.txt

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

dos2unix -437 input.txt input.txt
于 2009-12-15T12:36:50.673 回答
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)。

于 2014-01-01T19:31:16.103 回答
9

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

于 2020-12-03T12:17:02.753 回答
7

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

参考:文件格式

于 2012-02-17T22:59:25.940 回答
7
tr -d '\15\32' < winfile.txt > unixfile.txt

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

于 2012-05-24T04:03:26.547 回答
6

直接在 Linux 控制台中运行:

vim file.txt +"set ff=unix" +wq
于 2018-10-17T13:30:52.023 回答
5

使用以下命令:

:%s/^M$//g

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

于 2008-09-17T12:46:51.167 回答
5

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

我的工作替换命令是

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

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

:%s/^M/\r/g
于 2012-07-13T17:46:37.563 回答
4
:g/Ctrl-v Ctrl-m/s///

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

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

于 2008-09-17T12:45:34.510 回答
4

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

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

于 2016-04-30T18:11:19.073 回答
3

您可以使用:

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

dos2unix实用程序。

于 2016-12-15T13:13:11.480 回答
2

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

于 2008-09-17T12:46:12.027 回答
1

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

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done
于 2015-02-13T09:22:23.443 回答
1

在 Vim 中,键入:

:w !dos2unix %

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

于 2018-01-17T13:35:15.013 回答
0

通常有一个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}";
}
于 2009-07-30T09:46:04.687 回答
0

来自维基:

%s/\r\+$//g

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

于 2016-02-08T18:09:16.033 回答
0

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

autocmd BufWrite * :set ff=unix
于 2016-06-08T01:52:55.663 回答
0

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

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

或写入标准输出:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
于 2017-02-11T10:13:19.443 回答
0

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

在您的 Linux 终端上,键入

dos2unix filename.ext

这将发挥所需的魔力。

于 2017-08-24T07:02:23.543 回答
0

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

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

tr -d \\r < dosfile > newfile
    -- Originally by Dru <genesis@istar.ca>
于 2017-10-24T19:03:39.587 回答