2017-04-30 65 views
1

我有許多行的以下文本。連續的行是一個段落的一部分。但用空行分隔的行是單獨段落的一部分。因此,下面的文字有行2款:將行合併到vim中的段落

first group of lines. 
first group of lines. 
first group of lines. 
first group of lines. 
first group of lines. 
first group of lines. 

second group of lines. 
second group of lines. 
second group of lines. 
second group of lines. 
second group of lines. 
second group of lines. 

我使用下面的代碼連續行合併成幾段:

%s/\n\n\@!//g 

它導致:

first group of lines.first group of lines.first group of lines.first group of lines.first group of lines.first group of lines. 
second group of lines. second group of lines. second group of lines. second group of lines. second group of lines. second group of lines. 

因此段落形成但它們不會被空行隔開。如果我再次運行我的命令,這些也將合併成一個單一的段落。如何修改我的代碼以保留新生成的段落之間的空行,以便輸出如下:

first group of lines.first group of lines.first group of lines.first group of lines.first group of lines.first group of lines. 

second group of lines. second group of lines. second group of lines. second group of lines. second group of lines. second group of lines. 

感謝您的幫助。

回答

1
:%s/\([^\n]\)\n\([^\n]\)/\1\2/g 

做的工作。

在這裏您正在使用替換組。你搜索

  • 非新行字符
  • 新行字符(這將在後面省略)
  • 非新行字符(稍後\ 2印刷)
(稍後\ 1印刷)
+0

有關它如何工作的一些解釋將會有所幫助。使用此代碼時是否有任何需要注意的情況? – rnso

+0

當然。添加。 –

+0

實際上由@yolenoyer發佈的那個似乎對我更好 –

3

這一個工程(神似曼努埃爾·施密特的回答):

:%s/[^\n]\zs\n\ze[^\n]// 

幾點說明:

  • 會有什麼\zs\ze(回車\n
  • [^\n]指之間被移除住宿:任何字符,但回車

於是命令的意思是:請刪除回車,但只有當它在兩個非回車字符之間時

編輯:從墨爾波墨涅一個更好的解決方案:

:%s/.\zs\n\ze.// 
+1

您可以使用'.'而不是'[^ \ n]'。 – melpomene

+0

@melpomene:'。'意味着什麼。爲什麼它不刪除空白行,即將「\ n \ n下一行」替換爲「\ n下一行」? – rnso

+0

另外爲什麼在代碼結尾不需要'g'? – rnso

1

考慮到這是一個Vim的問題,這裏有一個VIM答案(而不是一個正則表達式的答案)。

線中的每塊由VIM視爲一個段落,所以從該段的任何位置可以輸入:

vipgJ 

這在視覺上選擇第(vip)並加入所有的線,而不添加或刪除空格(gJ)。

下面是創建其加入當前段落宏的一種方式,然後移動到下一個,準備再次運行:

qqvipgJjjq 

現在用@q運行宏。如果您知道要運行多少次,則可以使用該號碼前綴[email protected],或者只需輸入一個龐大的數字即可將其應用於文檔的其餘部分。

對於一個非常酷的技巧,你甚至可以寫宏來遞歸調用自己。它會繼續調用它自己,直到它不再進行更改 - 在這種情況下,當它到達文檔末尾時(確保您的q寄存器在開始之前爲空,否則您將在應用現有宏時寫入新的 - 您可以通過只輸入qqq)清除:

[email protected]@q 

說明:

  • qq:開始錄製宏到寄存器 「q」。
  • vipgJ:加入當前段落。
  • jj:向下移動2行到下一段落。
  • @q運行宏「q」(記錄時不做任何事,因爲寄存器「q」爲空)。
  • q:停止錄製宏。
  • @q:運行宏。
+0

您能統計文檔中的行數並使用該數字嗎? – rnso

+0

你不是在線操作,而是在一組行上操作,所以文件中的行數不起作用。無論如何,這並不重要 - 如果您想要將更改應用於整個文件,那麼您只需運行遞歸宏,或者使用像'999 @ q'這樣的大計數的簡單宏 – nickspoon