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

问题描述 投票:462回答:35

vim显示在每行结尾^ M

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

vim line-breaks
35个回答
113
投票

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

:e ++ ff = dos

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


12
投票

简单的事情对我有用

:%s/\r$//

12
投票

我用sed做了这个:

dos2unix filename


12
投票

^ M由Ctrl + V和M检索,也是如此

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

9
投票

怎么样:s/^M//g 这对我来说完全有效。

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


8
投票

Ctrl + M最小化我的窗口,但Ctrl + Enter实际上插入了一个 :%s/\r//g 字符。我还必须确保不要在按下之间取下Ctrl键。

所以我的解决方案是:

^M

其中:%s/<Ctrl-V><Ctrl-Enter>/\r/g 表示按住Ctrl键,按下并释放V键,按下并释放Enter键,然后释放Ctrl键。

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

上面的解决方案将在现有线之间添加一条额外的线,因为在<Ctrl-V><Ctrl-Enter>之后已经有一个不可见的\r

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

^M

:%s/<Ctrl-V><Ctrl-Enter>//g 的意思是“在这个缓冲区”,%的意思是“替代”,s的意思是“(找到)以下模式”,/指的是按下以获得<Ctrl-V><Ctrl-Enter>字符的键(见上文),^M的意思是“什么都没有”(或者,“这两个斜线之间的模式是空的”,而//是一个意思是“全局”的标志,而不是第一次出现在一条线上。


8
投票

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

g

说明:

  • 如果不加载任何.vimrc文件,请打开vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile
  • 运行myfile强制重新加载整个文件作为dos行结尾。
  • 运行:e ++ff=dos以使用unix行结尾写入文件
  • 退出电源

7
投票

这对我有用:

  1. 将文件格式设置为unix(q​​azxswpoi行结尾)
  2. 保存文件

所以在vim中:

:w ++ff=unix

7
投票

就我而言,

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

\n

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

:set ff=unix
:w

5
投票

或者,有一些名为dos2unix和unix2dos的开源实用程序可以执行此操作。在Linux系统上,它们可能默认安装;对于Windows系统,您可以从tr "\015" "\n" < inputfile > outputfile 等下载它们。


5
投票
Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,

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


555
投票

Command

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

其中<Ctrl-V><Ctrl-M>表示按Ctrl + V键,然后按Ctrl + M.

Explanation

:%s

替代,%=所有行

<Ctrl-V><Ctrl-M>

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

/\r/

新线(\r

g

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


4
投票

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


2
投票

这对我有用:

http://www.bastet.com/

1
投票

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

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

1
投票

这些建议都不适合我在使用vim和eclipse时设法获得大量:% s/\r\n/\r 换行符。我怀疑我遇到了一个外部案件,但万一我能帮助任何人。

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

它解决了我的问题


1
投票
^M

如果您使用:%s/.$//g 键入:g/^M/s// /g ,它将不接受。

你需要输入^M


1
投票

Shift+6 Caps+M给出了不必要的换行符。要处理这个问题,我们可以使用ctrl+v ctrl+m命令,如下所示:

^M

1
投票

只需删除.vimrc中的sed即可!


1
投票

使用以下命令之一:

sed 's/\r//g'

要么

set binary

0
投票

“此函数保留跳转列表

:%s/\r//g

0
投票

我花了一个下午与\ n ctrl-v 012挣扎(两者都为我提供了null)。并通过这个线程努力,直到我达到metagrapher的。

:%s/\r\(\n\)/\1/g 对我来说很好!

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

变成这样的东西:

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)

魔法。我非常感激


416
投票

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

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

其中^V^M表示键入Ctrl + V,然后按Ctrl + M.

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


0
投票

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

\r

希望能帮助到你!


183
投票

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

:set filetype=unix

:set fileformat=unix

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


105
投票

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

:%s/\r/\r/g

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


34
投票

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

我想它可能是unix,那么问题是你的文件是用fileformat=dos创建的,在行尾添加“^ M ^ J”但是用flieformat=unix读取只从行尾删除“^ J”,留下“^ M”那里。

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


28
投票

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

/^M

应该选择第一个坏线

:%s/^M/\r/g

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

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

编辑:

在我的Windows 10计算机上再次出现此问题,该计算机具有Ubuntu for Windows,我认为这会导致vim的文件格式问题。在这种情况下,将ff更改为unix,mac或dos只会将^ M更改为^ J并再次返回。

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

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

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

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


22
投票

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

键入:%s/

按CTRL-VCTRL-M

键入//g

按Enter键

所以Vim中的整体命令看起来应该像qazxsw poi

这样做::%s/^M//g(找到并替换):%s(那个符号)/^M/(没有字符)/(全球)。


15
投票

无需使用Ctrl:g

© www.soinside.com 2019 - 2024. All rights reserved.