【问题标题】:Can regex capture groups be used recursively?可以递归使用正则表达式捕获组吗?
【发布时间】:2022-01-08 11:43:30
【问题描述】:

我有一个大的制表符分隔文件,由两列组成,第二列由许多子分隔记录组成

A header Another header
rec1 field1;field2;field3;field4
rec2 field1;field2

我需要它看起来像

A header Another header
rec1 field1
rec1 field2
rec1 field3
rec1 field4
rec2 field1
rec2 field2

子分隔字段的数量从 1 到 200 多个不等。

我知道我可以通过编写一个程序来做到这一点,但我想做的是构造一个正则表达式,它在开头捕获第一个字段并将所有分号替换为 \r\1 所以我结束了记录编号后跟每行分隔的记录。

如果我尝试像这样的 vi 表达式

^\(.*\t\)\([^;]*\);/\1\2\r\1/g

它只替换第一次出现。有没有一种方法可以根据需要替换所有分号?

【问题讨论】:

  • 单次通过是不可能的。

标签: vi


【解决方案1】:

我想不出在单个正则表达式中执行此操作的方法,但您可以使用 以下宏:

记录到 q 寄存器中:其中^M 是按回车键的文字, ^R 是按 ctrl+R,^I 是按 Tab 键。 (未显示是我按下退出键退出插入模式回到 普通模式):

"xyiwf;s^M^Rx^I

这会将第一个单词拉入x 寄存器,然后找到下一个分号 并用换行符替换它,从 x 寄存器中粘贴被抽出的单词, 并放置一个标签。

然后您可以在所有行上使用分号重复该宏,如下所示:

:g/;/norm 200@q

每次重复都会“消耗”一个分号,直到没有分号为止(所以只要 放多少你需要的(200+)。

【讨论】:

    猜你喜欢
    • 2021-08-11
    • 1970-01-01
    • 2017-01-17
    • 2020-06-04
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多