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

Byt*_*ana 474 vim line-breaks

vim显示在每行结尾^ M

我怎么做用'正常'换行符替换它?

Leo*_*Hat 563

命令

:%s/<Ctrl-V><Ctrl-M>/\r/g
Run Code Online (Sandbox Code Playgroud)

其中<Ctrl-V><Ctrl-M>意味着键入Ctrl+ V然后Ctrl+ M.

说明

:%s
Run Code Online (Sandbox Code Playgroud)

替代,%=所有行

<Ctrl-V><Ctrl-M>
Run Code Online (Sandbox Code Playgroud)

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

/\r/
Run Code Online (Sandbox Code Playgroud)

用新行(\r)

g
Run Code Online (Sandbox Code Playgroud)

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

  • 对于这个问题,这绝对是正确的答案,如果你有一个^ M后跟一个新行,你想保留换行符但是删除^ M. 执行下面的其他替换会使文件重复间隔. (33认同)
  • 它删除了^ M个字符,但没有插入回车符. (21认同)
  • @jumpnett - 您需要按下键和弦Ctrl-V/Ctrl-M,而不是将其作为逐字文本输入. (14认同)
  • 如果您仍然缺少回车符(即^ M已被删除但所有内容都包裹在一行上),请执行:`:%s/<Ctrl-V> <Ctrl-M> /\r/g` (其中\ r \n用换行符替换^ M). (12认同)
  • 如果您在Windows上运行Vim,则需要使用<Ctrl-Q>而不是<Ctrl-V>. (7认同)
  • 当我遇到这个问题时,这是正确的解决方案.虽然它并不那么简单.如果文件具有CRLF结尾,则此方法有效;而如果从一个文件转换为另一个,则%s/^ V ^ M/^ V ^ M/g方法有效.文件打开时的设置_和_当Git在后台更新时会影响这一点,因为Vim可能会在打开文件时猜测模式,但如果文件在打开时更改,则会读取所有内容. (2认同)
  • 确保实际按Ctrl-V和Ctrl-M而不是复制和粘贴字符串. (2认同)

Pau*_*lin 418

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

:%s/^V^M/^V^M/g
Run Code Online (Sandbox Code Playgroud)

其中^V^M意味着键入Ctrl+ V,然后Ctrl+ M.

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

  • 接受的答案是不正确的.这个更好用. (77认同)
  • 这是一个非常神秘的命令,但它在Mac上适用于我. (12认同)
  • 当你的文件中没有新行时,这是一个不同的问题,我承认这是更常见的.FYI ^ M可以与\ r匹配 (7认同)
  • 我发现等效的`%s /\r /\r/g`在MacVim上运行良好,文件只显示行末尾的"^ M"(MacVim术语中的一条长行).显然\ r \n表示模式与此命令的替换部分不同. (5认同)
  • 为什么这会得到一个downvote?它的工作原理,即使你的文件被捣碎到一行,因为它的行末端是错误的. (3认同)
  • 不.我的方法是用正确的行结束替换文件中的行尾. (2认同)
  • @jumpnett,你输入不对.冒号,然后百分比,然后s,然后斜线,然后控制v,然后控制m,然后斜线,然后控制v,然后控制m,然后斜线,然后g,然后返回. (2认同)

Jon*_*ler 183

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

:set filetype=unix

:set fileformat=unix

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

  • 这修复了我遇到的错误... Vim开始认为我的UNIX格式文件是windows,新更改的行在git diff中显示^ M. (6认同)
  • use:set fileformat = unix对于大多数配置,filetype仅更改正在使用的语法类型. (3认同)
  • 这也适用于vi BTW,你可以用同样的方式`set ff = unix`做一个小快捷方式`ft`是`filetype`的快捷方式 (3认同)

Pam*_*Pam 124

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

:e ++ ff = dos

发现于:http://vim.wikia.com/wiki/File_format

  • `:e ++ ff = dos`后跟`:set ff = unix`将结尾转换为合理的格式. (17认同)

net*_*ica 105

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

:%s/\r/\r/g
Run Code Online (Sandbox Code Playgroud)

这很有趣,因为我用相同的字符替换换行符,但我想Vim只需要获得一个新的\ r来正确显示.我有兴趣知道为什么这有效的基本机制.

  • `:%s /\r // g`在windows'gVim中为我工作 (4认同)
  • 在本页提供的所有解决方案中,这是唯一一种用于从csv文件中删除^ M的模式。使用MacVim。 (2认同)

che*_*san 34

首先,:set ff?用来确定文件的文件格式.

我想它可能是unix,那么问题是你的文件是fileformat=dos通过在行结尾添加"^ M ^ J" 创建的,但是flieformat=unix只读取行结束时的"^ J",留下"^ M".

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

  • 我必须做两件事.`:e ++ ff = dos` then`:set ff = unix`和`:w` (3认同)

Met*_*her 28

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

/^M
Run Code Online (Sandbox Code Playgroud)

应该选择第一个坏线

:%s/^M/\r/g
Run Code Online (Sandbox Code Playgroud)

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

这是MacVim中的功能,它基于gvim 7.

编辑:

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

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

:%s/\r$/ /g
:%s/ $//g
Run Code Online (Sandbox Code Playgroud)

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

很抱歉恢复了一个早已被回答的旧问题,但似乎有一些混乱,我想我会帮助清除一些,因为这在Google搜索中很高.


d-_*_*_-b 22

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

类型 :%s/

CTRL-VCTRL-M

类型 //g

Enter

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

这样做:( :%s查找和替换)/^M/(该符号)/(没有字符)g(全局).


And*_*dge 15

^ M是由检索Ctrl+ VM,所以做

s/^M//g
Run Code Online (Sandbox Code Playgroud)


BHa*_*man 15

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


Sha*_*han 12

简单的事情对我有用

dos2unix   filename
Run Code Online (Sandbox Code Playgroud)


Fre*_*Ben 12

我用sed做了这个:

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


ton*_*hnb 9

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

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


Mic*_*ith 9

这个问题有很多其他答案,但是,以下对我来说最好,因为我需要一个命令行解决方案:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile
Run Code Online (Sandbox Code Playgroud)

说明:

  • 无需加载任何.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
Run Code Online (Sandbox Code Playgroud)

<Ctrl-V><Ctrl-Enter>按住 Ctrl,按下并释放V,按下并释放Enter,然后释放 Ctrl.

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

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

要防止这种情况,您需要删除^M字符而不替换它们.

:%s/<Ctrl-V><Ctrl-Enter>//g
Run Code Online (Sandbox Code Playgroud)

其中%"在此缓冲区中"的s意思是"替代",/意思是"(找到)以下模式",<Ctrl-V><Ctrl-Enter>指的是按下以获取^M角色的键(见上文),//意思是"没有任何东西"(或",带有模式")在这两个斜杠之间,它是空的"),并且g是一个标志意思是"全局",而不是第一次出现在一行中.


Str*_*ker 7

这对我有用:

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

所以在vim中:

:set ff=unix
:w
Run Code Online (Sandbox Code Playgroud)


Vis*_*a k 7

就我而言,

没有上面的工作,我有一个CSV文件从我的Mac复制到Linux机器,我使用了上述所有命令,但没有任何帮助,但下面的一个

tr "\015" "\n" < inputfile > outputfile
Run Code Online (Sandbox Code Playgroud)

我有一个文件,其中^ M个字符在下面的行之间被切换

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,
Run Code Online (Sandbox Code Playgroud)


Con*_*lls 5

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


Blu*_*ond 5

sed s/^M//g file1.txt > file2.txt
Run Code Online (Sandbox Code Playgroud)

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