Vim正则表达式:在不以"#"开头的所有行上方添加行。

时间:2014-11-18 15:54:23

标签: regex vim replace line regex-group

我有一个文本文件,其结构如下:

The quick  
#a comment
brown 
fox jumps  
#another comment
over  
the 
lazy
#yet another comment
dog

所以每一行都包含" normal"文字或以"#"开头的评论。 我希望使用正则表达式替换此文本,以便每个"文本" -line在其上方获得注释行。结果应该是这样的:

#auto comment
The quick  
#a comment
brown 
#auto comment
fox jumps  
#another comment
over  
#auto comment
the 
#auto comment
lazy
#yet another comment
dog

然而,虽然我花了很多时间,但我还是无法创建一个正常运行的正则表达式。我的正则表达式失败的情况总是至少有一个特殊情况。 我能创造的最好的是:

:%s/^\([^#].*\)\n\([^#].*\)$/\1\r#auto comment\r\2/g

如果我运行两次,这个工作完全正常(第一行除外)。但是只运行一次就跳过一些线路,例如我得到了这个结果:

The quick
#a comment
brown
#auto comment
fox jumps
#another comment
over
#auto comment
the
lazy
#yet another comment
dog

请注意," "之间没有插入任何行。和" 懒惰"。原因是,术语""是正则表达式组的一部分,是替换文本的一部分,所以它不会再被正则表达式解析。

有没有可能(我敢打赌有,我只是无法找到它......)来解决这个问题? 我意识到检查第一行也是另一个问题。如果能够认识到这一点会很棒,但这不是我主要关注的焦点。

3 个答案:

答案 0 :(得分:2)

您可以使用负面后顾\@<!,以确保上一行不是评论。

%s/\(^#.*\n\)\@<!\_^[^#]/#auto comment\r&

有关详细信息,请参阅:

:h /\@<!
:h /\_^
:h s/\\&

答案 1 :(得分:0)

使用::%s/^\([^#].*\)/#auto comment\r\1/g

然后运行::%s/^\(#.*\)\n#.*/\1/g

:%s/^\([^#].*\)/#auto comment\r\1/g | %s/^\(#.*\)\n#.*/\1/g

答案 2 :(得分:0)

([^#\n]+\n#[\w ]+?\n[^\n]+(?:\n|$))|^([^\n]+\n)

试试这个。#auto comment\n$1$2。见。演示。

http://regex101.com/r/lZ5mN8/24