使用正则表达式查找Vim中的行尾但不是段落

时间:2012-06-25 14:27:28

标签: regex vim

我正在尝试加入一个段落中的所有行,但不会将一个段落加入下一个段落。

在我的文本文件中,段落不是由它们之间的空行定义,而是在行尾的句点中定义。在句号之后可能会有空格,但它仍然定义了段落的结尾。

所以,我想做一个跳转到下一行的宏,而不是停留在那些末尾有句号的行。

我做了这个正则表达式:

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

含义:找到任何不是点或空格的字符,可选地后跟空格,然后是行尾。

然后我会应用J命令将该行与下一行连接起来,然后重复。

它在Regexpal.com上运行正常,但在VIM中,它会在具有句点和两个空格的行中停止。

我做错了什么?

3 个答案:

答案 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