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

标签 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

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

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

最佳答案

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

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

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

  • 综合起来:
    :global/^\a/,/^  \* .*\n\a/join
    

    关于regex - Vim - 如何使用匹配模式连接行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34951522/

    相关文章:

    python - django url 中 uuid 十六进制值的正则表达式

    java - 获取 java.util.regex.PatternSyntaxException : Illegal repetition when trying to replace String with replaceAll()

    c# - 有条件地加入 LINQ?

    VIM - 快速拉出尴尬文本 block 的方法

    Vim 在 tmux 中显示不正确的颜色

    c++ - std::basic_regex<char32_t>,有人已经尝试了吗?

    java - 代码的正则表达式

    MySQL JOIN、WHERE 和 IF 问题

    c# - 组合多个列表

    python - Vim 插件并不总是加载?