Vim - 如何使用匹配模式连接行?

7

我有一个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

基本模式应该是:“从第一行以字母开头的行开始,连接所有行,直到最后一行以\ \ \*\开头的下一行,然后重复直到文件结尾。”
我该怎么写呢?也许我应该分两步进行 - 也就是说,是否有一种方法可以先连接所有以字母开头的行,然后连接所有以\ \ \*\开头的行,然后连接每对结果?
2个回答

11

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

实际上,你可以把它几乎逐字翻译成Vimscript:

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

总体而言:

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

0

编辑:算了,我刚意识到我的解决方案需要设置一堆设置才能工作。要使其普遍适用,您需要

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

即使如此,这也假定没有一个业务块超过1024行。在那种情况下,最好使用范围。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接