我有一个文本文件,其结构如下:
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
请注意," "之间没有插入任何行。和" 懒惰"。原因是,术语""是正则表达式组的一部分,是替换文本的一部分,所以它不会再被正则表达式解析。
有没有可能(我敢打赌有,我只是无法找到它......)来解决这个问题? 我意识到检查第一行也是另一个问题。如果能够认识到这一点会很棒,但这不是我主要关注的焦点。
答案 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
。见。演示。