在Vim中进行搜索/替换

12

我想删除所有与此正则表达式匹配的方括号:\[.*\].*{,但我只想删除方括号,不想删除后面的内容。也就是说,当方括号后面跟着一个左花括号时,我只想删除方括号及其中的内容。

如何在Vim的查找/替换中完成这个操作?

4个回答

18

你可以使用\zs\ze来设置匹配的开始和结束位置。

:%s/\zs\[.*\]\ze.*{//g应该可以工作。

这里是告诉Vim,将\zs\ze之间的内容替换为空字符串。

(请注意您需要在您的Vim二进制文件中编译+syntax选项)

欲了解更多信息,请参见:help /\zs:help pattern

编辑: 实际上,在这种情况下,\zs并不是必要的,但我为了教育目的而保留它。:)


我不知道这个存在!非常好的提示! - Brian Riehman

6

如果你在正则表达式的最后一部分加上括号,你可以在替换中重复使用它:

:%s/\[.*\]\(.*{\)/\1/g

\1代表正则表达式中括号内的部分。

我喜欢在进行搜索和替换之前先构建我的搜索字符串,以确保在更改文档之前它是正确的:

/\[.*\]\(.*{\)

这将突出显示您将要替换的所有出现情况。
然后运行%s命令而不使用搜索词来使其重新使用上次的搜索词。

:%s//\1/g

我点赞这个主要是因为它向我展示了令牌用于替换组的作用,我习惯使用$1来替换术语,但显然应该使用\1 - icc97

2
如何呢:
:%s#\[.*\]\ze.*{##g

请注意,\ze项目标记了匹配的结尾,因此跟随其后的任何内容都不会被替换。

0

这将在当前文件上运行您的正则表达式:

:%s/\[.*\]\(.*{\)/\1/g


这正是我的问题,我想保留花括号,只删除括号及其内部内容。 - Amir Rachum
哦,我不确定你是否只需要vim中正则表达式的语法。我编辑了我的答案,提供了另一种可能的解决方案,尽管现在已经有几个可行的答案发布了。 - Dan Breen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接