【问题标题】:How to match the end of a line but not a paragraph with a regex in Vim?如何在 Vim 中匹配行尾而不是段落与正则表达式?
【发布时间】:2012-06-25 14:27:28
【问题描述】:

我正在尝试连接段落中的所有行,但不将一个段落与下一个段落连接。

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

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

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

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

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

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

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

我做错了什么?

【问题讨论】:

  • 那个找到每个段落的结尾。我想找到除那些之外的每一行的结尾,以应用 th J 命令。也许我可以使用您的搜索来应用 J 的替代方法,将所有选定的行连接起来,而不是这一行与下一行……我猜是使用视觉模式?

标签: regex vim


【解决方案1】:

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

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

解释:

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

然后这个正则表达式被替换为一个空格。

【讨论】:

    【解决方案2】:

    如果光标位于段落的第一行, 一个人可以加入它的行与

    :,/\.\s*$/j
    

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

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

    【讨论】:

      【解决方案3】:

      这应该会让你分道扬镳:使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-13
        • 1970-01-01
        • 2013-10-28
        • 2013-09-05
        • 1970-01-01
        • 1970-01-01
        • 2018-05-04
        • 1970-01-01
        相关资源
        最近更新 更多