2012-06-25 41 views
1

我想加入段落中的所有行,但不能加入下一個段落。在正則表達式中找到行結束但不是段落

在我的文本文件中,段落不是由它們之間的空行定義的,而是在行尾的一段時間。這段時間後可能會有空格,但它仍然定義段落的結尾。

所以,我想要做一個跳轉到下一行的宏,而不是停在那些有一段時間的行上。

我這樣做的正則表達式:

[^\.\s][\s]*$ 

含義:發現這不是一個點,也不是空格,後面可以跟空格,然後通過行尾的任意字符。

然後我會應用J命令加入下一個行,然後重複。

它在Regexpal.com上正常工作,但在VIM中,它停在有句點和兩個空格的行中。

我在做什麼錯?

+1

可以嘗試用'/ \ \ S * $ /'? – shime

+0

那一個發現每一段的結尾。我想找到每一行結束,但是那些,應用J命令。也許我會使用你的搜索來應用J的替代方法,即加入所有選定的行,而不是下一個...使用視覺模式,我猜? –

回答

3

而不是使用宏中的正則表達式與J命令一起使用,如何使用正則表達式替換來移除換行符?這似乎爲我工作:

:%s/[^\.]\s*\zs$\n\(^\s*$\n\)*//

說明:

  • [^\.]\s*\zs$\n - 線未與期間;在換行前開始替換。
  • \(^\s*$\n\)* - 包括只含有空格

此正則表達式然後用空間置換的任何其他線路。

2

如果光標位於段落的首行,可以加入其 線,

:,/\.\s*$/j 

要做到在一個緩衝區中的所有段落一樣,使用命令

:g/^/,/\.\s*$/j 
1

這應該讓你參與其中:使用shime的正則表達式(\.\s*$)來確定要加入的行,然後使用:v//j!將每條這樣的行連接到下一行。

然後重複:v//j!命令,直到完成。 (定義宏來完成它::map v :v//j!<cr>,然後只需點擊v反覆)

更好的解決方案,如果你是一個* NIX樣的機器上是:

awk '/\.\s*$/ { printf("%s\n", $0);} { printf("%s", $0); } END { printf("\n"); }' <your_file >your_other_file 
相關問題