【问题标题】:Why is \r a newline for Vim?为什么 \r 是 Vim 的换行符?
【发布时间】:2010-09-09 10:37:15
【问题描述】:

来自问题How to replace a character for a newline in Vim?。替换换行符时必须使用 \r,如下所示

:%s/%/\r/g

但是当替换一个字符的行尾和换行符时,你可以这样做:

:%s/\n/%/g 

手册的哪一部分记录了这些行为,它们背后的原因是什么?

【问题讨论】:

  • 搜索和替换时% 是什么意思?
  • @qed:默认情况下,:s 只会将替换应用于当前行。 :%s 使其寻址整个文件。 More.
  • +c24w 我认为他指的是斜杠之间的“%”,第一个示例中的“%”在搜索位置,在第二个示例中的替换位置,但是@qed要回答你的问题,那些 '%' 是从字面上匹配的。

标签: vim


【解决方案1】:

来自http://vim.wikia.com/wiki/Search_and_replace

搜索时

...

\n 是换行符,\rCR(回车 = Ctrl-M = ^M

更换时

...

\r 是换行符,\n 是空字节 (0x00)。

【讨论】:

  • 这个答案对我帮助最大。另外,如需更多信息,:h :s%,尤其是最后一段。 (通过:h :s
  • 是的,你写的更多,但我认为你没有添加任何材料。
【解决方案2】:

来自vim docs on patterns

\r 匹配

\n 匹配行尾 - 当匹配一个字符串而不是 缓冲文本文字换行符 字符匹配。

【讨论】:

  • 对我来说,混淆点是 \r 和 \n 在使用时表示不同的东西是搜索模式和替换模式。
  • @dlamblin 是的!看我的回答:)
【解决方案3】:

另一个方面是\0,传统上是NULL,被带入 s//\0/ 表示“整个匹配模式”。 (顺便说一下,这与& 相比是多余的,并且比& 更长)。

  • 所以你不能用\0来表示NULL,所以你用\n
  • 所以你不能用\n来表示\n,所以你用\r
  • 所以您不能使用\r 来表示\r,但我不知道谁会故意添加该字符。

——☈

【讨论】:

  • 好点!所以这是围绕 \0 的 hack - 对第 0 个嵌套组的反向引用 - 整个正则表达式。这是一个很好的答案,但它让我感到失望,我不能使用 \r 代替......(意思是:插入#(13),例如在“普通”文件中(== unix EOLs)。
  • 好的,答案在 Vim 文档中。只需使用正常的反斜杠转义 \^M 或 \。好的。 ----- 此时将行一分为二(将 键入为 CTRL-V s \r 同上 ------- - s/\r \ 插入回车符 (CTRL-M) (将 键入为 CTRL-V s/\
  • “另一个方面”?你太谦虚了!准确解释为什么会发生这种情况,对于那些只是说如何解决它的人来说,是一个更好的答案。 +1
  • 老实说,这真的很好地洞察了为什么\n 在搜索和替换模式中具有不同的含义。很棒的答案。
【解决方案4】:

:help NL-used-for-Nul

技术细节:

文件中的<Nul> 字符在内存中存储为<NL>。在显示器 它们显示为“^@”。翻译在阅读和写作时完成 文件。要将 <Nul> 与搜索模式匹配,您只需输入 CTRL-@ 或 “CTRL-V000”。这可能正是您所期望的。在内部 在搜索模式中,字符被替换为 <NL>。不寻常的是 输入CTRL-V CTRL-J 也会插入<NL>,因此也会搜索<Nul> 在文件中。 {Vi 根本无法处理文件中的<Nul> 字符}


【讨论】:

    【解决方案5】:

    首先,打开:h :s查看“更改”文档的“4.2替换”部分。以下是命令接受的内容:

    :[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
    

    注意关于patternstring的描述

    对于{pattern},请参阅|pattern|
    {string} 可以是文字字符串,也可以是其他东西
    特别的;见|sub-replace-special|

    所以现在您知道搜索模式和替换模式遵循不同的规则。 如果您点击|pattern| 的链接,它会将您带到解释 Vim 中使用的整个正则表达式模式的部分。

    同时,|sub-replace-special| 带您进入“4.2 替换”小节,其中包含替换模式,其中\r 用于换行/拆分。

    (这部分手册的快捷方式是:h :s%

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 2016-06-23
      • 2013-08-25
      • 1970-01-01
      • 2013-10-14
      • 2020-08-19
      相关资源
      最近更新 更多