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

vim在每行结尾^ M显示

我如何用“正常”换行符取代这个?

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

:e ++ ff = dos

find它在http://vim.wikia.com/wiki/File_format

命令

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

其中<Ctrl-V><Ctrl-M>表示键入Ctrl + V,然后Ctrl + M。

说明

 :%s 

替代,%=所有行

 <Ctrl-V><Ctrl-M> 

^ M字符(Ctrl-V是写入Ctrl ^字符的Vim方式,Ctrl-M写入正则expression式后的M,导致^ M特殊字符)

 /\r/ 

用新行( \r

 g 

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

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

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

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

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

vim ,看一下文件格式 – DOS或者Unix:

:set filetype=unix

:set fileformat=unix

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

MacVim中看到的一个用BBEdit创build的文件显示了一堆^M行返回,而不是常规的返回。 下面的stringreplace解决了这个问题 – 希望这有助于:

:%s/\r/\r/g

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

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

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

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

为了得到^ M字符匹配我不得不直观地select它,然后使用操作系统复制到剪贴板命令来检索它。 在尝试replace命令之前,可以通过search字符来testing它。

 /^M 

应该select第一个坏的路线

 :%s/^M/\r/g 

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

这是基于gvim 7的MacVim中的function。

编辑:

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

在这种情况下的解决scheme:

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

我走这条路的原因是因为我想确保我对我的文件没有破坏性。 我可以有:%s/\r$//g但这会删除回车右键,并可能有意想不到的结果。 相反,我们将单个的CR字符(这里是一个^ M字符)转换成一个空格,然后删除行末尾的所有空格(对我而言,这是一个理想的结果)

很抱歉,我们已经回答了一个早已被回答的旧问题,但似乎有一些困惑正在进行,我想我会帮助清理一些问题,因为这在谷歌search中已经达到高潮。

这些都没有为我工作,所以我试了这个,工作:

键入:%s/

CTRL-V CTRL-M

键入//g

Enter键

因此,Vim中的总体命令如下所示:%s/^M//g

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

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

简单的事情,为我工作

 dos2unix filename 

那么只是:: :%s/\r//g这完全为我工作。

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

我用sed做了这个:

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

^ M通过Ctrl + VM检索,所以可以

 s/^M//g 

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

所以我的解决scheme是:

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

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

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

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

为了防止这种情况,您希望删除^M字符而不需要replace它们。

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

其中%表示“在这个缓冲区中” s意思是“替代”, /意味着“(find)下面的模式,” <Ctrl-V><Ctrl-Enter>指的是按键来获得^M字符上面), //意思是“没有任何东西”(或者,“这两个斜杠之间的模式是空的”), g是一个标志,意思是“全局的”,而不是一行中的第一个出现。

另外,还有一些开源工具叫做dos2unix和unix2dos,可以做到这一点。 在Linux系统上,它们可能是默认安装的; 对于Windows系统,您可以从http://www.bastet.com/下载它们。;

就我而言,

上面没有任何工作,我有一个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, 

对于这个问题还有很多其他的答案,但是,我仍然需要一个命令行解决scheme:

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

说明:

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

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

这对我工作:

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

所以在vim中:

 :set ff=unix :w 
 sed s/^M//g file1.txt > file2.txt 

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

这对我工作:

 :% s/\r\n/\r 

为了节省击键 ,您可以避免在一个映射中inputCtrl + V Ctrl + M。 只需打开一个包含^ M字符的文件,就可以将其拖到.vimrc中,并粘贴到这样一行:

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

这些build议没有任何工作为我已经设法得到一个负载的^M线换行符与VIM和日食工作。 我怀疑我遇到了一个外部案件,但如果它帮助我做了任何人。

 :%s/.$//g 

它整理了我的问题

 :g/^M/s// /g 

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

你需要inputctrl+v ctrl+m

我知道这可能太老了,但希望有人能find这个有用的。

使用这些命令:

 :%s/\r//g 

要么

 :%s/\r\(\n\)/\1/g 

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

 sed 's/\r//g' 

只要在您的.vimrc中删除set binary

“这个function保留了跳转列表

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

我花了一个下午努力\ n ctrl-V 012(这两个都提供了空值)。 通过这个线程,直到我达到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日:i386(0.99.19-2.1)

魔法。 我非常感激

或者不使用vim,你可以使用这个命令修复换行符

 fromdos <filename.txt> 

希望它有帮助!