用Enter替换回车符^M

48

我知道如何在文件中删除^M%s/^M//g),但我希望将这一行中的^M替换为回车符... 在VIM中,回车符是什么字符(以在命令行模式下使用)。

我知道如何在文件中删除^M%s/^M//g),但这次我只想用回车符来替换一个字符,该怎么办?在VIM中,回车符是什么字符(以在命令行模式下使用)。


一般的“替换为换行符”的问题可以在以下链接找到:https://dev59.com/iXVD5IYBdhLWcg3wJIEK 但是由于查找回车符有点特殊,因为涉及到set ff,而且这是第一个谷歌搜索结果,也许我们应该将其单独处理。 - Ciro Santilli OurBigBook.com
6个回答

66

为了将回车符(即 <C-m>)替换为换行符(即Unix换行符),你需要运行一个有些奇怪的命令:

%s/\r/\r/g

看起来好像什么也没做,但在正则表达式和双引号字符串中,回车符用\r表示,换行符用\n表示,而在:s命令的替换部分和substitute()函数中,则相反。

请注意,在终端中,Enter键会产生<C-m>,因此您最初的请求无效。


3
很好;我阅读了这篇文章,以更好地理解在使用vim进行搜索和替换时的\n\r - Abraham Sangha
如果您正在运行vim脚本,则为exec“%s / \ r / \ r / g” - phyatt

56

:%s/\r//g 只适用于以下情况:

  • set ff=unix,当执行此操作时,自动将所有的 CRLF 转换为 LF

  • set ff=dosCR 是“流氓字符”,前面没有 LF,例如使用 C-V C-M 插入。

    LF CR 成对出现的 CR 不会被找到。

因此,如果您只想将每个 LF CR 转换为 LF,则应使用:

:set ff=unix
:w

17

在正常模式下,您可以使用r<CR>替换一个字符。
或者您可以通过键入<C-v><CR>在命令行模式下输入"返回"。


14
在 vim 会话中尝试执行以下操作:
:%s/^M//g

通过同时按下ctrl+V+M键可实现^M


3
从技术上讲,这是两个单独的按键。在 <C-v> 之后输入的任何内容都会被字面插入。 - mike3996
谢谢,但我知道如何做,由于某种奇怪的原因,这个文件只包含 ^M 而没有回车,所以我不得不执行 :%s/^M/^M/g,其中最后一个 ^M 是实际的回车。 - igorgue

10

与@ZyX和@anubhava类似,但是假设您只是尝试从Windows文件中删除烦人的回车符,那么以下方法就足够了:

:%s/\r//g

1

LF: 换行符

CRLF: 回车换行符

^M:vim将其解释为回车部分。您还可以使用\r进行搜索。

对于我的情况,我不想将其替换为任何其他的换行格式(如LF等),而只是用句号和空格(. )来代替。因为本应该是一个新的句子,但一些回车符却参与了进来。可能是用户打错字了。

来源:

I'll be there^M
We can talk.

I'll be there. We can talk.

帮助我的是:

:%s/^M\n/\. 

或者

:%s/\r\n/\. 

(末尾有一个空格)

对我来说,两者都很好用。\r\n 更容易打。

Ctrl+M,Ctrl+V插入^M

(CentOS Linux 7.2)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接