如何在vim中打开的文件中将^ M换行符转换为“正常”换行符?


481

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

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



3
请将该解决方案更改为文件格式更改,因为这是最干净的解决方案。
erikbwork

1
我知道这个问题与vim有关,但是其他一些Google搜索也在该线程中。因此,如果您的系统上安装了Eclipse,则可以单击几下即可转换单个文件或完整文件树的行定界符:stackoverflow.com/a/7019737/1364747
Teddy

我喜欢您将常规换行符称为“正常”的方式-与那些^ M换行符相反:-)
DerMike

Answers:



577

命令

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

其中<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

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


21
它删除了^ M个字符,但未插入回车符。
luckytaxi

14
@jumpnett-您需要按和弦Ctrl-V / Ctrl-M,而不是将其作为逐字文本输入。
LeopardSkinPillBoxHat 2012年

33
这绝对是该问题的正确答案,如果您有一个^ M后接新行,则您希望保留换行符,但删除^ M。在下面进行其他替换,将文件加倍间隔。
dlamblin

12
如果仍然缺少回车符(即^ M已删除,但所有内容都包装在一行中),请执行以下操作:%s/<Ctrl-V><Ctrl-M>/\r/g:(其中\ r用换行符替换^ M)。
威廉·特雷尔

7
如果在Windows上运行Vim,则需要使用<Ctrl-Q>而不是<Ctrl-V>。
2014年

418

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

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

其中^V^M表示类型Ctrl+ V,然后表示Ctrl+ M

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


3
为什么这会引起反对?即使您的文件由于错误的行结尾而混搭在一行上,它也能正常工作。
Paul Tomblin,2009年

2
否。我的方法用正确的行尾替换文件中的行尾。
Paul Tomblin,2009年

7
当您的文件中没有新行时,这是一个不同的问题,我承认这很常见。FYI ^ M可以由\ r
dlamblin

12
这是一个非常神秘的命令,但在Mac上对我有用。
埃里克·沃克

5
我发现%s/\r/\r/g在MacVim上,对于仅^M在行尾显示的文件(在MacVim术语中为一长行),该文件相当有效。显然,\ r在模式中与在此命令的替换部分中具有不同的含义。
RichVel

184

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

:set filetype=unix

:set fileformat=unix

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


3
使用:set fileformat = unix对于大多数配置,文件类型仅更改所使用的语法类型。
derGral 2011年

6
这解决了我遇到的错误。Vim开始认为我的UNIX格式文件是Windows,新更改的行在git diff中显示^ M。
Thomas Hunter II

必须取决于系统。今天,这个工作了。set命令在vim,btw之内完成。
gbarry 2012年

1
太好了!因为文件格式是dos,所以将其设置为unix,就可以了
zhaozhi2014年

3
这也可以在vi BTW上使用,您可以set ff=unix通过以下方式来作为一个快捷方式ftfiletype
Posva 2015年

110

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

:%s/\r/\r/g

很有意思,因为我用相同的字符替换了换行符,但是我认为Vim只需要重新输入\ r就可以正确显示。我很想知道为什么这种机制有效。


1
搜索功能倾向于接受更广泛的规则来识别行尾序列。但是\ r在作为数据写入时具有特定含义。
gbarry 2012年

这在Windows gVim中对我有用,可以整理出没有换行符的文件,而只需换许多^ M。
Flash

2
在本页提供的所有解决方案中,这是唯一一种用于从csv文件中删除^ M的模式。使用MacVim。
B6431 2014年

+1也为我工作,同时使用Mobaterm从Windows SSH连接到Ubuntu Trusty
Carl

因此,尽管指定为替换\r字符,但这似乎仍替换了所有字符。不抱怨,那正是我想要的。真奇怪 \n\r
甜甜圈2014年

34

首先,使用:set ff?找出文件的文件格式。

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

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


3
我必须两者都做。:e ++ff=dos然后,:set ff=unix以及:w
最多

29

为了使^ M字符匹配,我必须在视觉上选择它,然后使用OS复制到剪贴板命令来检索它。您可以在尝试替换命令之前通过搜索字符来对其进行测试。

/^M

应该选择第一行

:%s/^M/\r/g

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

这是基于gvim 7的MacVim中的功能。

编辑:

我的Windows 10计算机(具有适用于Windows的Ubuntu)在Windows 10计算机上再次遇到此问题,我认为这会导致vim出现文件格式问题。在这种情况下,将ff更改为unix,mac或dos只是将^ M更改为^ J然后再次返回。

在这种情况下的解决方案:

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

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

抱歉,很久以来一直在回答这个老问题,但似乎有一些混乱,我认为我会帮助解决其中的一些问题,因为这在Google搜索中排名很高。


1
按下ctrl-v ctrl-m可能也可以插入字符fwiw。但是\ r会插入正确的回车符。
Metagrapher

1
这是正确的答案。如上所述,使用<ctrl-v> <ctrl-m>可以在命令中插入文字^ M。
carlosayam 2012年

1
我同意,尽管我确信如果在原始发布时对我有用,那么我就不会发布。;)
Metagrapher 2012年

22

这些都不对我有用,所以我尝试了这个,它起作用了:

类型 :%s/

CTRL-VCTRL-M

类型 //g

Enter

因此,Vim中的整体命令应该像 :%s/^M//g

这是做什么的:(:%s查找并替换)/^M/(该符号)/(不带任何字符)g(全局)。


砰!在Mac上可以使用。
shamail




12

我是用sed完成的:

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


您确定这可行吗?在OSX上:sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand

是的,它可以工作(我经常使用),但是在OSX上,如果您未安装sed的GNU版本,则可能无法工作。Apple默认情况下提供的sed版本与所有Linux发行版中提供的GNU版本(非常)不同(非常遗憾)。请查看此问题的答案以获取更多帮助: stackoverflow.com/q/30003570/2062384
Freedom_Ben

谢谢@Freedom_Ben。因此,听起来这对GNU有效,sed但对BSD无效sed(在OSX上可以找到)。修复换行符的任何人都可能使用多种操作系统,因此弄清楚答案何时起作用将非常有用。
阿曼德

10

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

这样做只是清除所有行的行尾,它删除了^ M,仅此而已。


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

3
谢谢!这解决了我的问题,
并发现在

8

Ctrl+ M最小化了我的窗口,但是Ctrl+ Enter实际上插入了一个^M字符。我还必须确保Ctrl在两次按压之间不要抬起钥匙。

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

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

<Ctrl-V><Ctrl-Enter>手段按住不放 Ctrl,按下并释放键V,按下并释放键Enter然后松开 Ctrl

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

上面的解决方案将在现有的行之间添加一条额外的行,因为\r后面已经存在一个不可见的行^M

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

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

其中%“在此缓冲区中” s是指“替代”,/是“(找到)以下模式”,<Ctrl-V><Ctrl-Enter>是指按下以获取^M字符的键(见上文),//是“无”(或“有模式”在两个斜杠之间,它们之间是空的”),并且g是一个标志,表示“全局”,与一行中的第一个出现相反。


7

这为我工作:

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

因此在vim中:

:set ff=unix
:w

1
这个为我工作,而没有被接受的答案。
Marcello Romani

7

就我而言

上面没有任何工作,我从Mac复制了一个CSV文件到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,

5

另外,也可以使用称为dos2unix和unix2dos的开源实用程序来完成此任务。在Linux系统上,它们可能是默认安装的。对于Windows系统,您可以从http://www.bastet.com/下载它们。


5
sed s/^M//g file1.txt > file2.txt

同时按下3个键输入^ M, ctrl + v + m


4

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


以前从未听说过mac2unix,如果可以的话,请再次投票!
库夫

哈雷!这是要走的路!
2016年



1

为了节省按键,就能避免打字Ctrl+ VCtrl+ M通过映射把这个。只需打开一个包含^ M字符的文件,对其进行提取,然后将其粘贴到.vimrc中的这样的行中:

nnoremap <Leader>d :%s/^M//g<CR>

1

这些建议对我都没有用,^M在使用vim和eclipse时设法获得了很多换行符。我怀疑我遇到了一个外部案件,但以防万一,这对我所做的任何事情都有帮助。

:%s/.$//g

它解决了我的问题


这将删除行尾的任何字符。如果您的行由于某种原因而没有以^ M结尾,那么您还将删除该字符,这将是意外的。事实并非如此,但是如果确实如此,并且您不知道这一点,那么您可能会以一种非常难以识别的方式篡改文件。
Metagrapher

1
:g/^M/s// /g

如果您^M使用键入Shift+6 Caps+M,则不会接受。

您需要输入ctrl+v ctrl+m


1

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

sed 's/\r//g'

idk为什么将其降级为-1 ...,因为它使用sed?您可以在vim中执行相同的替换操作,并且应该可以工作
Metagrapher

1

只需删除set binary您的.vimrc!


在另一个线程中,建议使用“设置二进制”来摆脱自动插入新行的麻烦。
dexter2305

1

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

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

说明:$'STRING'此处的语法与bash shell有关。Mac不\r视为特殊字符。通过引用其中的命令字符串,$''您可以告诉外壳程序替换为ANSI-C标准中指定\r的实际\r字符。


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()

在这种情况下,使用* NIX的本机dos2unix命令怎么了?linux.die.net/man/1/dos2unix
Metagrapher 2011年

0

我花了一个下午努力争取\ n ctrl-v 012(两者都为我提供了null)。并通过这个线程进行工作,直到我到达了传记作者的手。

\r 对我来说很好!

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

变成了这样的东西:

blacklist-extra: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)

魔法。我深表感谢

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.