[英]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.