2

我试图加入一个段落中的所有行,但不将一个段落与下一个段落连接起来。

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

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

我使用了这个正则表达式:

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

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

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

它在RegexPal上运行良好,但在 Vim 中它停在有句点和两个空格的行处。

我究竟做错了什么?

4

3 回答 3

3

与其在宏中将正则表达式与J命令一起使用,不如使用正则表达式替换来删除换行符?这似乎对我有用:

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

解释:

  • [^\.]\s*\zs$\n-- 不以句点结尾的行;在换行之前开始替换。
  • \(^\s*$\n\)*-- 包括仅包含空格的任何其他行

然后用空格替换这个正则表达式。

于 2012-06-25T15:00:18.887 回答
2

如果光标位于段落的第一行,则可以将其行与

:,/\.\s*$/j

要对缓冲区中的所有段落执行相同操作,请使用命令

:g/^/,/\.\s*$/j
于 2012-06-25T18:06:26.030 回答
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
于 2012-06-28T20:22:39.447 回答