我想在第七次出现后删除多行上的分号,可能如下所示:
foo;10.10.10.10;/24;;NA;;;foo;酒吧; “foobar”
意思是结果应该是这样的:
foo;10.10.10.10;/24;;NA;;;foo 栏“foobar”
到目前为止我所能做的是将这些部分分割成捕获组:
:%s/(.{-};.{-};.{-};.{-};.{-};.{-};.{-};)(.*)
我的问题是我不知道如何删除捕获组中的字符 - 我该如何解决这个问题?
一种方法:
:%s/\v^([^;]*;){7}\zs.*/\=substitute(submatch(0), ';', '', 'g')/
如果每行都有相同的格式,您可以简单地使用宏。 宏还为您提供了一种灵活的方式,以清晰直观的方式进行更多处理 - 您只需以您知道的最简单的方式做您想做的事,然后 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@一个
您也可以使用这个正则表达式:
:%s/\(\(.\{-};\)\{7}\)\|;/\1/g