簡體   English   中英

如何在 Vim 中用正則表達式匹配行尾而不是段落?

[英]How to match the end of a line but not a paragraph with a regex in Vim?

我正在嘗試將一個段落中的所有行連接起來,但不將一個段落與下一個段落連接起來。

在我的文本文件中,段落不是由它們之間的空行定義的,而是在行尾有一個句點。 句點之后可能有空格,但它仍然定義了段落的結尾。

所以,我想做一個跳轉到下一個行尾的宏,而不是停在那些末尾有句點的行上。

我使用了這個正則表達式:

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

含義:查找既不是句點也不是空格的任何字符,可選地后跟空格到行尾。

然后我會應用J命令將匹配的行與下一行連接起來,然后重復。

它在RegexPal上運行良好,但在 Vim 中,它在有句號和兩個空格的行處停止。

我究竟做錯了什么?

與其在宏中將正則表達式與J命令結合使用,不如使用正則表達式替換來刪除換行符怎么樣? 這似乎對我有用:

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

解釋:

  • [^\.]\s*\zs$\n -- 不以句點結尾的行; 在換行符之前開始替換。
  • \(^\s*$\n\)* -- 包括僅包含空格的任何其他行

然后將此正則表達式替換為空格。

如果光標位於段落的第一行,可以用

:,/\.\s*$/j

要對緩沖區中的所有段落執行相同操作,請使用命令

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

這應該讓你走到那里:使用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

暫無
暫無

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

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