【问题标题】:^M vs \n in vim string replacementvim 字符串替换中的 ^M vs \n
【发布时间】:2017-06-03 06:54:07
【问题描述】:

在进行字符串替换 (:s/x/y/) 时,Vim 对待 ^M 的方式似乎有些不对称。

也许最好举个例子;假设我们有这个文本文件:

foo:bar:biz

我想把它分成几行。这工作正常:

:s/:/^M/g

(注意^M是通过输入Ctrl-VEnter产生的)

这会产生文本文件:

foo
bar
baz

现在,如果我撤消该操作并重试,我注意到这 不起作用

:s/:/\n/g

这里,结果文本是:

foo^@bar^@biz

也就是说,它们是由 ASCII NUL 字节(0x00)连接起来的。

问题1:为什么在替换中使用\n会导致NUL字节?

现在,我想“好吧,我猜 ^M 以某种方式用作 Vim 的‘行分隔符’字符;我可以使用它”。

所以我做了另一个实验,从每行一项的文本文件开始:

foo
bar
baz

现在,我想用冒号加入它们,所以它看起来像上面的第一个化身。

所以我跑了:

:%s/^M/:/

但这失败了,出现错误:

E486: Pattern not found: ^M

但是,这个命令确实有效:

:%s/\n/:/

制作:

foo:bar:biz:

(我可以自己去掉尾随的冒号)

所以问题 2:为什么 \n 在这种情况下可以工作,而 ^M 却不行?

最后,问题 3:为什么 \n^M 之间存在这种不对称,这取决于它是在字符串替换命令的右侧还是左侧? p>

【问题讨论】:

标签: vim replace newline


【解决方案1】:

在搜索时,\n 是一个“包罗万象”的原子,可以方便地匹配任何类型的“行尾”:CRLFCRLF

替换时,\n<Nul>,表示为^@

替换时,\r 是当前 fileformat 的合法“行尾”。

简而言之,习惯这种模式并继续:

:s/\n/\r

请参阅 :help NL-used-for-NulCR-used-for-NL

【讨论】:

  • 感谢您的帮助链接。看起来根本问题是s/// 的“搜索”和“替换”部分使用不同的语法,这就是它的方式。未来搜索者的其他帮助页面::help sub-replace-special:help pattern:help :s。对于替换端,\r^M 具有相同的含义(帮助页面用“同上”表示,我觉得有点奇怪)。
猜你喜欢
  • 1970-01-01
  • 2011-04-28
  • 2021-09-26
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2011-09-18
相关资源
最近更新 更多