在Vim中发生第n次后删除符号

时间:2016-10-13 12:08:54

标签: regex vim

我想在第7次出现后删除分号,在多行上可能如下所示:

FOO; 10.10.10.10 / 24 ;; NA ;;; FOO;酒吧; “foobar的”

意味着结果应该是这样的:

foo; 10.10.10.10; / 24 ;; NA ;;; foo bar“foobar”

到目前为止,我能够将部分划分为捕获组:

:%S /(.{-};.{-};.{-};.{-};.{-};.{-};.{-};)(.*)

我的问题是我不知道如何删除捕获组中的字符 - 我该怎么做?

2 个答案:

答案 0 :(得分:2)

一种方法:

:%s/\v^([^;]*;){7}\zs.*/\=substitute(submatch(0), ';', '', 'g')/

答案 1 :(得分:1)

如果每一行具有相同的格式,您只需使用宏即可。 宏也为您提供了一种灵活的方式,以更清晰,更直观的方式处理更多的处理 - 您只需以您知道的最简单的方式执行您想要的操作并重复它。 在这个例子中,它将是:

<强>线

foo;10.10.10.10;/24;;NA;;;foo; bar; "foobar"
foo;10.10.10.10;/24;;NA;;;foo; bar; "foobar"
foo;10.10.10.10;/24;;NA;;;foo; bar; "foobar"

记录宏

qa08f;xjq

并重复N次,例如1000

1000@a

<强>解释

qa - record macro with name a
0 - move cursor to the begging of line
8f; - move cursor to the 8th occurences of semicolon
x - remove semicolon
j - move cursor to the next line
q - finish macro

And repeat macro number of times you need
1000@a