【问题标题】:Vim - how to join lines using matching patternVim - 如何使用匹配模式连接行
【发布时间】:2016-04-29 08:06:10
【问题描述】:

我有一个包含企业联系信息的 txt 文件。目前,每一行都包含不同的业务数据。我正在尝试构建一个以管道分隔的文件,其中每个企业的所有信息都在一行中。问题是每个业务都有不同数量的线路。所以文件看起来像这样:

Awesome Company Inc|
Joe Smith, Owner|
Jack Smith, Manager|
Phone: (555)456-2349|
Fax: (555)456-9304|
Website: www.awesomecompanyinc.com [HYPERLINK: http://www.awesomecompanyinc.com]|
  * Really Cool Company|
  * Line of business: Awesomesauce|
Killer Products LLC|
Jack Black, Prop|
Phone: (555)234-4321|
Fax: (555)912-1234|
1234 Killer Street, 1st Floor|
Houston, TX 77081|
  * Apparel for the classy assassin|
  * Fearful Sunglasses|
  * Member of the National Guild of Killers since 2001|
  * Line of business: Fuhgettaboutit|

等等

所以我可以使用:g/<pattern>/j 来连接模式中的线条,但我无法确定模式应该是什么。在上面的例子中,需要连接第 1-9 行,然后是第 10-19 行。

关键是以 2 个空格和一个星号开头的行:

  * Line of business

该模式基本上应该说:“从以字母开头的第一行开始,连接所有行直到最后一行以\ \ \*\开头的第一行,然后重复直到文件末尾。”

我该怎么写?我是否应该分两步进行 - 即,有没有办法先加入所有以字母开头的行,然后加入所有以\ \ \*\ 开头的行,然后加入每个结果对?

【问题讨论】:

    标签: regex join vim flat-file


    【解决方案1】:

    从以字母开头的第一行开始,连接所有行,直到最后一行以\ \ *\ 开头的第一行,然后重复直到文件末尾。

    实际上,您几乎可以将其翻译成 Vimscript:

    • 以字母开头的第一行开始/^\a/
    • 直到以*开头的最后一行之后的第一行是/^ \* .*\n\a:找到以项目符号开头的行(^ \*),匹配该行的其余部分(.*),并断言下一行不是项目符号行 (\n\a)
    • 然后重复直到文件结束。通过:global完成

    综合起来:

    :global/^\a/,/^  \* .*\n\a/join
    

    【讨论】:

      【解决方案2】:

      编辑:没关系,刚刚意识到必须设置很多设置才能使我的解决方案正常工作。要使其正常工作,您需要

        for i in range(10)
            try
                 v/business/join
            endtry
         endfor
      

      甚至假设没有超过 1024 行的业务块。那时你不妨使用范围

      【讨论】:

        猜你喜欢
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 2013-08-13
        相关资源
        最近更新 更多