在 Vim 中删除第 n 次出现后的符号

问题描述 投票:0回答:3

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

foo;10.10.10.10;/24;;NA;;;foo;酒吧; “foobar”

意思是结果应该是这样的:

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

到目前为止我所能做的是将这些部分分割成捕获组:

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

我的问题是我不知道如何删除捕获组中的字符 - 我该如何解决这个问题?

regex vim
3个回答
2
投票

一种方法:

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

1
投票

如果每行都有相同的格式,您可以简单地使用宏。 宏还为您提供了一种灵活的方式,以清晰直观的方式进行更多处理 - 您只需以您知道的最简单的方式做您想做的事,然后 vim 重复它。 在这个例子中它将是:

线条

foo;10.10.10.10;/24;;NA;;;foo;酒吧; “富巴”
foo;10.10.10.10;/24;;NA;;;foo;酒吧; “富巴”
foo;10.10.10.10;/24;;NA;;;foo;酒吧; “富巴”

录制宏

qa08f;xjq

并重复N次,例如1000

1000@a

说明:

qa - 录制名为 a 的宏
0 - 将光标移动到行的开头
8f; - 将光标移动到第 8 个出现的分号
x - 删除分号
j - 将光标移动到下一行
q - 完成宏

并重复您需要的宏次数
1000@一个

0
投票

您也可以使用这个正则表达式:

:%s/\(\(.\{-};\)\{7}\)\|;/\1/g
© www.soinside.com 2019 - 2024. All rights reserved.