[英]Vim regex: add line above all lines not starting with “#”
我有一個文本文件,其結構如下:
The quick
#a comment
brown
fox jumps
#another comment
over
the
lazy
#yet another comment
dog
因此,每一行都包含“普通”文本或以“#”開頭的注釋。 我希望使用正則表達式替換此文本,以便每個“文本”行在其上方都有一條注釋行。 結果應該是這樣的:
#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
請注意,沒有線之間“ 的 ”和“ 懶惰 ”插入。 這樣做的原因是,術語“ the”是regex組的一部分,並且是替換文本的一部分,因此regex不會再次對其進行解析。
是否有解決此問題的可能性(我敢打賭,我只是找不到它...)? 我意識到檢查第一行也是另一個問題。 如果也可以認識到這一點,那就太好了,但是目前這不是我的主要關注重點。
您可以使用否定的后綴\\@<!
,以確保上一行不是注釋。
%s/\(^#.*\n\)\@<!\_^[^#]/#auto comment\r&
有關更多信息,請參見:
:h /\@<!
:h /\_^
:h s/\\&
使用:: :%s/^\\([^#].*\\)/#auto comment\\r\\1/g
然后運行:: :%s/^\\(#.*\\)\\n#.*/\\1/g
或 :%s/^\\([^#].*\\)/#auto comment\\r\\1/g | %s/^\\(#.*\\)\\n#.*/\\1/g
:%s/^\\([^#].*\\)/#auto comment\\r\\1/g | %s/^\\(#.*\\)\\n#.*/\\1/g
([^#\n]+\n#[\w ]+?\n[^\n]+(?:\n|$))|^([^\n]+\n)
試試這個。用#auto #auto comment\\n$1$2
代替。請參閱演示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.