簡體   English   中英

Vim正則表達式:在所有不以“#”開頭的行上添加行

[英]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代替。請參閱演示。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM