我正在尝试加入一个段落中的所有行,但不会将一个段落加入下一个段落。
在我的文本文件中,段落不是由它们之间的空行定义,而是在行尾的句点中定义。在句号之后可能会有空格,但它仍然定义了段落的结尾。
所以,我想做一个跳转到下一行的宏,而不是停留在那些末尾有句号的行。
我做了这个正则表达式:
[^\.\s][\s]*$
含义:找到任何不是点或空格的字符,可选地后跟空格,然后是行尾。
然后我会应用J命令将该行与下一行连接起来,然后重复。
它在Regexpal.com上运行正常,但在VIM中,它会在具有句点和两个空格的行中停止。
我做错了什么?
答案 0 :(得分:3)
使用正则表达式替换来删除换行符,而不是在宏中结合使用J
命令中的正则表达式?这似乎对我有用:
:%s/[^\.]\s*\zs$\n\(^\s*$\n\)*/ /
说明:
[^\.]\s*\zs$\n
- 不以句号结尾的行;在换行前开始更换。\(^\s*$\n\)*
- 包含仅包含空格的任何其他行然后用空格替换这个正则表达式。
答案 1 :(得分:2)
如果光标位于段落的第一行,则可以加入其中
行:,/\.\s*$/j
要对缓冲区中的所有段落执行相同操作,请使用命令
:g/^/,/\.\s*$/j
答案 2 :(得分: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