Vim在每一行结束时显示^M。
我如何用在Vim中打开的文件中的普通换行符替换它?
Vim在每一行结束时显示^M。
我如何用在Vim中打开的文件中的普通换行符替换它?
当前回答
为了让^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字符)转换为空格,然后删除行尾的所有空格(无论如何,这对我来说都是一个理想的结果)
很抱歉重新提出一个早已被回答的老问题,但似乎有一些困惑正在进行中,我想我可以帮助澄清一些,因为这是谷歌搜索的高。
其他回答
^M是由Ctrl+V和M检索的
s/^M//g
在Linux和Mac OS上,以下工作,
:%s/^V^M/^V^M/g
其中^V^M意味着输入Ctrl+V,然后Ctrl+M。
注意:在Windows上,你可能想使用^Q而不是^V,因为默认情况下^V被映射为粘贴文本。
Ctrl+M最小化我的窗口,但Ctrl+Enter实际上插入一个^M字符。我还必须确保不要在按下Ctrl键之间松开。
所以我的解决方案是:
:%s/<Ctrl-V><Ctrl-Enter>/\r/g
其中<Ctrl-V><Ctrl-Enter>表示按住Ctrl,然后释放V,然后释放Enter,然后释放Ctrl。
如果您正在处理windows生成的文件
上面的解决方案将在现有的行之间添加额外的行,因为^M后面已经有一个不可见的\r。
为了防止这种情况,您需要删除^M字符而不替换它们。
:%s/<Ctrl-V><Ctrl-Enter>//g
其中%表示“在这个缓冲区中”,s表示“替换”,/表示“(找到)下面的模式”,<Ctrl-V><Ctrl-Enter>指按下得到^M字符的键(见上文),//表示“没有”(或者,“在这两个斜杠之间的模式,是空的”),g是一个标志,表示“全局”,而不是一行中第一次出现。
命令
:%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
并且全局执行(而不仅仅是行上的第一个事件)。
^M给出不需要的换行符。要处理这个问题,我们可以使用sed命令,如下所示:
sed 's/\r//g'