507

vim 显示在以 ^M 结尾的每一行

我如何用“正常”换行符替换它?

4

37 回答 37

599

命令

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

where<Ctrl-V><Ctrl-M>表示类型Ctrl+V然后Ctrl+ M

解释

:%s

替换,% = 所有行

<Ctrl-V><Ctrl-M>

^M 字符(Ctrl-V 是 Vim 写 Ctrl ^ 字符的方式,Ctrl-M 在正则表达式后面写 M,产生 ^M 特殊字符)

/\r/

换行 ( \r)

g

并在全球范围内进行(不仅仅是在线上的第一次出现)。

于 2009-05-01T12:48:40.217 回答
424

在 Linux 和 Mac OS 上,以下工作,

:%s/^V^M/^V^M/g

where^V^M表示类型Ctrl+ V,然后是Ctrl+ M

注意:在 Windows 上,您可能希望使用^Q而不是^V,因为默认情况下^V映射到粘贴文本。

于 2009-05-01T12:47:21.890 回答
186

vim中,查看文件格式 — DOS 或 Unix:

:set filetype=unix

:set fileformat=unix

该文件将被写回,没有回车(CR,^M)字符。

于 2009-05-01T12:57:04.253 回答
149

这是唯一对我有用的东西:

:e ++ff=dos

在以下位置找到它:http: //vim.wikia.com/wiki/File_format

于 2014-04-02T15:30:11.437 回答
120

我在MacVim中看到的使用 BBEdit 创建的文件显示的是一堆^M换行符,而不是常规的换行符。以下字符串替换解决了这个问题 - 希望这会有所帮助:

:%s/\r/\r/g

这很有趣,因为我用相同的字符替换换行符,但我想 Vim 只需要一个新的 \r 才能正确显示。我很想知道为什么这有效的潜在机制。

于 2012-09-27T04:46:16.440 回答
35

首先,用于:set ff?确定您的文件的文件格式。

我想可能是这样unix,那么问题是您的文件是通过fileformat=dos将“^M^J”添加到行尾来创建的,但读取时flieformat=unix只从行尾删除了“^J”,而将“^M”留在那里。

只需:e ++ff=dos在 Vim 命令行中输入即可将文件格式从 unix 更改为 dos。它应该可以解决问题。如果没有,:%s/\r//g应该可以帮助你。

于 2012-03-07T04:01:20.707 回答
29

为了让 ^M 字符匹配,我必须直观地选择它,然后使用操作系统复制到剪贴板命令来检索它。您可以通过在尝试替换命令之前搜索字符来测试它。

/^M

应该选择第一条坏线

:%s/^M/\r/g

将用回车替换所有错误的 ^M。

这是基于 gvim 7 的 MacVim 中的函数。

编辑:

在我的 Windows 10 机器上再次遇到这个问题,它有 Ubuntu for Windows,我认为这会导致 vim 的文件格式问题。在这种情况下,将 ff 更改为 unix、mac 或 dos 只是将 ^M 更改为 ^J 并再次返回。

这种情况下的解决方案:

:%s/\r$/ /g
:%s/ $//g

我走这条路的原因是因为我想确保我的文件是非破坏性的。我本可以,:%s/\r$//g但那样会直接删除回车,并且可能会产生意想不到的结果。相反,我们将单个 CR 字符(此处为 ^M 字符)转换为空格,然后删除行尾的所有空格(无论如何,这对我来说都是一个理想的结果)

很抱歉恢复了一个早已被回答的老问题,但似乎有一些混乱正在发生,我想我会帮助解决其中的一些问题,因为这在谷歌搜索中排名很高。

于 2011-04-25T19:36:57.733 回答
22

这些都不适合我,所以我尝试了这个,它有效:

类型:%s/

CTRL-VCTRL-M

类型//g

Enter

所以 Vim 中的整体命令应该看起来像:%s/^M//g

这是做什么的:(:%s查找和替换)/^M/(那个符号)/(没有字符)g(全局)。

于 2014-05-10T18:51:21.637 回答
18

^M 由Ctrl+V和检索M,所以这样做

s/^M//g
于 2009-05-01T12:47:02.717 回答
16

无需使用 Ctrl: :%s/\r$//

于 2015-10-06T19:46:01.050 回答
14

对我有用的简单事情

dos2unix   filename
于 2014-11-07T07:30:16.000 回答
14

我用 sed 做到了这一点:

sed -i -e 's/\r/\n/g' filename

于 2015-01-03T04:08:16.727 回答
10

怎么样: :%s/\r//g 这对我完全有用。

这样做只是为了清除所有行的行尾,它删除了 ^M 就是这样。

于 2014-07-11T12:47:32.050 回答
9

这个问题还有很多其他的答案,但是,以下最适合我,因为我需要一个命令行解决方案:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

解释:

  • 不加载任何 .vimrc 文件,打开myfile
  • 运行:e ++ff=dos以强制重新加载整个文件作为 dos 行结尾。
  • 运行:w ++ff=unix以使用 unix 行结尾写入文件
  • 退出 vim
于 2017-04-22T15:04:25.437 回答
8

Ctrl+M最小化我的窗口,但Ctrl+Enter实际上插入了一个^M字符。我还必须确保Ctrl在两次按下之间不要松开按键。

所以对我来说解决方案是:

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

where<Ctrl-V><Ctrl-Enter>表示按住 Ctrl,按下并释放V,按下并释放Enter然后释放 Ctrl

如果您正在处理 Windows 生成的文件

上述解决方案会在现有行之间添加一个额外的行,\r因为^M.

为防止这种情况,您希望删除^M字符而不替换它们。

:%s/<Ctrl-V><Ctrl-Enter>//g

where%表示“在此缓冲区中”,s表示“替换”,/表示“(找到)以下模式,”<Ctrl-V><Ctrl-Enter>表示要按下以获取^M字符的键(见上文),//表示“没有任何内容”(或者,“使用模式在这两个斜杠之间,它是空的”),并且g是一个标志,意思是“全局”,而不是一行中的第一次出现。

于 2017-04-04T15:55:11.897 回答
7

这对我有用:

  1. 将文件格式设置为 unix(\n行尾)
  2. 保存文件

所以在 vim 中:

:set ff=unix
:w
于 2016-11-30T20:30:26.980 回答
7

就我而言,

上面没有任何效果,我有一个 CSV 文件从我的 mac 复制到 Linux 机器,我使用了上述所有命令,但除了下面的命令之外没有任何帮助

tr "\015" "\n" < inputfile > outputfile

我有一个文件,其中 ^M 字符被夹在行之间,如下所示

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,
于 2016-12-04T02:53:34.143 回答
5

或者,有一些名为 dos2unix 和 unix2dos 的开源实用程序可以执行此操作。在 linux 系统上,它们可能是默认安装的;对于 Windows 系统,您可以从http://www.bastet.com/下载它们。

于 2009-05-01T13:10:59.447 回答
5
sed s/^M//g file1.txt > file2.txt

其中 ^M 是通过同时按下 3 个键来键入的,ctrl + v + m

于 2014-08-04T10:07:26.063 回答
4

如果文件是在 windows 上创建的,则使用 dos2unix 实用程序,如果文件是在 mac 上创建的,则使用 mac2unix 实用程序。:)

于 2012-09-25T12:29:04.520 回答
4

使用以下命令之一:

:%s/\r//g

或者

:%s/\r\(\n\)/\1/g
于 2015-06-10T10:45:49.653 回答
2

为了节省击键,您可以通过将其放置在映射中来避免键入Ctrl++ 。只需打开一个包含 ^M 字符的文件,将其拉出,然后将其粘贴到 .vimrc 中这样的行中:VCtrlM

nnoremap <Leader>d :%s/^M//g<CR>
于 2013-12-06T09:18:44.970 回答
2

这对我有用:

:% s/\r\n/\r
于 2014-04-18T01:09:34.283 回答
2

sed在 MacOS 上使用,请执行以下操作:

sed -i.bak $'s/\r//' <filename>

说明:这里的$'STRING'语法与 bash shell 相关。Mac 不\r视为特殊字符。通过引用命令字符串,$''您告诉 shell 替换为 ANSI-C 标准中指定\r的实际字符。\r

于 2019-01-22T15:04:37.180 回答
1

这些建议都没有对我有用,因为我在^M使用 vim 和 eclipse 时设法获得了大量的换行符。我怀疑我遇到了一个外部案例,但以防万一它对我做过的任何人有所帮助。

:%s/.$//g

它解决了我的问题

于 2014-04-03T23:16:46.813 回答
1
:g/^M/s// /g

如果你输入^M使用Shift+6 Caps+M它不会接受。

您需要输入ctrl+v ctrl+m.

于 2015-04-30T05:42:40.017 回答
1

^M给出不需要的换行符。为了解决这个问题,我们可以使用sed如下命令:

sed 's/\r//g'
于 2016-07-20T11:03:07.320 回答
1

只需set binary在您的 .vimrc 中删除!

于 2017-05-26T12:37:31.167 回答
1

在 Solaris 上:

:%s/<CTRL+V><CTRL+M>//g

那是:

:%s/^M//g

这意味着:

  • % = 所有行,
  • s = 替代品,
  • ^M = 您想要替换的内容
  • // = 替换为空
  • g = 全局(不仅是第一次出现)
于 2020-12-02T09:20:12.033 回答
1

在 VIM 的命令模式下:

:e ++ff=dos | setl ff=unix | up

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

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

up- 仅在修改后保存文件。

于 2020-12-03T17:52:38.377 回答
0

" 这个函数保存了跳转列表

fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
    set ff=unix
    w!
    "%s/\%x0d$//e
catch /E32:/
    echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()
于 2011-04-25T23:06:30.440 回答
0

我花了一个下午的时间与 \n ctrl-v 012 (两者都为我提供null)苦苦挣扎。一直在这个线程中工作,直到我到达 metagrapher 的位置。

\r对我来说很好!

/),/s/),/)\r/g

变成了这样:

黑名单额外:i386 (0.4.1, 0.4.1+nmu1), libmount1:i386 (2.20.1-5.1, 2.20.1 -5.2), libblkid1:i386 (2.20.1-5.1, 2.20.1-5.2) , libapt-pkg4.12:i386 (0.9.7.4, 0.9.7.5), nmap:i386 (6.00-0.1, 6.00-0.2), libsane-common:i386 (1.0.22-7.3,

变成这样的东西:

26 libwv-1.2-4:i386 (1.2.9-3, 自动)
27 openjdk-6-jre-headless:i386 (6b24-1.11.4-3, 自动)
28 jed:i386 (0.99.19-2.1)

魔法。我非常感激

于 2013-01-21T16:28:24.217 回答
0

或者,您可以使用此命令修复换行符,而不是使用 vim

fromdos <filename.txt>

希望能帮助到你!

于 2013-03-17T16:39:39.850 回答
0

以上都不适合我。(替换 \r, ^M, ctrl-v-ctrl-m )我使用复制和粘贴将我的文本粘贴到一个新文件中。

如果您有干扰的宏,您可以:set paste在粘贴操作之前和:set nopaste之后尝试。

于 2014-07-28T15:59:05.923 回答
0

在 vim 中,使用命令:

:%s/\r\n/\r/g

您要搜索和替换的位置:

\r\n

进入

\r

/G

适用于全球

请注意,这与@ContextSwitch 的答案相同,但带有 gobal 标志

于 2015-08-14T00:54:03.753 回答
0

在串行控制台上,所有 vi 和 sed 解决方案都不适合我。我不得不:

cat inputfilename | tr -d '\r' > outputfilename
于 2016-11-16T12:37:56.660 回答
-1

在 Windows 中时,请尝试:%s/<C-Q><C-M>/g

于 2017-01-17T12:45:20.800 回答