Vim中的正则表达式 - 在编号行之前插入空白行

时间:2017-07-04 15:04:14

标签: regex vim

我有以下文字:

Title line
1. First list
First line
Second line
2. Second list
Oranges
Mangoes
3. Stationary
Pen
Pencils
Etc

我想在每个编号行之前添加一个空行,以便上面的文字如下所示:

Title line

1. First list
First line
Second line

2. Second list
Oranges
Mangoes

3. Stationary
Pen
Pencils
Etc

我尝试了以下代码,但它无效:

%s/^(\d)/\r\1/g

%s/(^\d)/\r\1/g

s/^([0-9])/\r\1/gc

问题在哪里以及如何解决。谢谢你的帮助。

3 个答案:

答案 0 :(得分:4)

您应该在VIM语法中转义括号,以表示它是一个特殊的集群:

%s/^\(\d\)/\r\1/g

或者使用匹配零宽度断言\ze)令牌:

%s/^\ze\d/\r

答案 1 :(得分:3)

要使用捕获组()而不必转义它们,请使用\v非常神奇(请参阅:h /magic

:%s/\v^(\d)/\r\1/

请注意g标志是多余的,因为在行的开头只能有一个匹配

由于替换部分需要整个匹配的字符串,因此可以使用&\0而无需显式捕获组

:%s/^\d/\r&/


comments

中提到
:g/^\d/norm O

g命令允许过滤行并在这些行上执行命令,例如norm O以打开上面的新行。默认范围是整个文件,因此不需要%

使用substitute命令,这将是:g/^\d/s/^/\r/

有关:h :g

的完整命令列表,请参阅:h ex-cmd-index:g

答案 2 :(得分:1)

您可以使用全局命令:g在匹配的数字:put之前的每一行上执行空^\d

:g/^\d/pu!_

注意:使用黑洞记录器"_:put组合给我们空行。

如需更多帮助,请参阅:

:h :g
:h /\d
:h :put
:h quote_