2011-12-15 43 views
1

的文本文件的格式是這樣的:VIM正則表達式:多行編輯和控制光標位置

Section 4 Area B Unit 20 
    stuff i don't need... 
    stuff i don't need... 
    45990 - Title of Project that I want to save 
    line of text I need to keep 
    line of text I need to keep 
    2010-11 this line (starting with 2010) is not needed 
    stuff i don't need 

Section 589 Area C Unit 1005 
    stuff i don't need... 
    stuff i don't need... 
    45990 - Title of Project that I want to save 
    line of text I need to keep 
    line of text I need to keep 
    2010-11 this line (starting with 2010) is not needed 
    stuff i don't need 

和這些部分重複由數百人。 「我不需要的東西」線實際上是大約30個左右。我需要保持「Section ...」行,「Title ...」行和「我需要保留的文本行」之間的關聯性。所以我希望在進一步操作之前(字符方式),首先將文本文檔(線條)破壞爲我所需要的東西。所以我寫了這一點:

​​

刪除我得到的「節..」線和「標題......」行之後,但從來沒有後續行「標題..」線下方。隨後的線路從4線到8線不等,但「2010-11」線是一致的,總是我不再需要的線。

你可以看到我試過用zs和ze來選擇我不想刪除的東西。我認爲選擇是有效的,因爲如果我將命令更改爲「2011-12」,則不匹配,命令的(OR)一半不返回結果。

我認爲故障可能是光標位置(?),但我不確定,而且我的解決方案的努力失敗了。

任何人都可以看到我的錯誤?

謝謝!

回答

1

給這個旋轉。

:silent! g/^Section/+ , /^\s\+\d\+ -/- d 
:g/^\s\+2010/ , -/\nSection\|\%$/ d 
1

:g找到每一行匹配模式的開始,!將恢復選擇並將命令應用於這些行。

會喜歡g/^Section.../normal! j2dd3jd}嗎?

如果不是,您可以在正常範圍內搜索標題行! 您可能需要將其放在「exec」中,但編寫函數可能會更簡單。

你真的需要使用vim嗎?看起來像Perl的工作給我。

+0

感謝您的回覆。我不知道Perl。另外,我使用兩個vim插件訪問並轉儲一個網頁到一個vim緩衝區中進行編輯;不知道在Perl中會做同樣的事情。我想我可以留在vim中並改變我的方法。 g!並且v的逆轉是已知的,這就是爲什麼/ d會刪除所有內容而不是預期的選擇。我不明白爲什麼後面的3行以下的「Title ..」在運行後不會顯示 - 儘管它們似乎在命令中找到。 – Ricalsin 2011-12-15 23:55:39

+0

哪兩個vim插件?如果你不介意我問。 – 2011-12-16 06:11:18

+0

@Derek netrw和elinks – Ricalsin 2011-12-16 15:01:37

1

有很多方法可以做,我敢肯定。我認爲這個命令序列應該可以工作(忽略以雙引號開頭的註釋行):

" global delete of line below 'Section' to line before 'Title' 
g/^\s*Section/+1;/Title/-1delete 
" global delete from date line to line before 'Section' 
g/^\s*\d\d\d\d-\d\d/;/^\s*Section/-1delete 
" go to top line of buffer 
gg 
" delete last chunk, from final date to last line 
/^\s*\d\d\d\d-\d\d/;$delete