Vim - 如何使用匹配模式连接线条

时间:2016-01-22 16:32:21

标签: regex join vim flat-file

我有一个包含商家联系信息的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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

  • 从以字母开头的第一行开头是/^\a/
  • 直到以* 开头的最后一行之后的第一行为/^ \* .*\n\a:找到以项目符号(^ \*)开头的行,与其他行匹配(.*)行,并声明下一行不是项目符号(\n\a
  • 然后重复,直到文件结束。通过:global完成

合在一起:

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

答案 1 :(得分:0)

编辑:没关系,只是意识到必须为我的解决方案设置一系列设置。为了使它通常你需要

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

即便如此,假设没有超过1024行的业务块。此时你也可以使用范围