首页 > 解决方案 > vim:如何通过匹配第一部分来查找单词,删除第一部分然后在单词末尾添加一个字符串

问题描述

在我们的代码中,我们的变量有非标准的命名约定。例如,我们有一个附加到文件中许多变量的类别标识符,例如:usa_foo, bar_usa,其中usa是类别标识符。我想将所有这些名称转换为最后放置类别 id 的标准,所以usa_foo会变成foo_usa. 由于这些变量通常嵌入在表达式中,因此它们后面可以跟一些可能的字符,在这种情况下(hashicorp hcl 语言),主要是、 "或空格。例如,我想转:],

usa_foo = something
something "${var.usa_foo}"
b = [var.usa_foo, var.bar_usa]
bar_usa

进入:

foo_usa = something
something "${var.foo_usa}"
b = [var.foo_usa, var.bar_usa]
bar_usa

如果我知道单词后面的字符,我知道如何查找和替换,比如说"。那么它将是

%s/usa_\(\w*\)"\(.*\)/\1_usa"\2/g

但是,我不确定如何匹配多个结尾字符并且仍然做同样的事情。

标签: vimfind-replace

解决方案


使用非常神奇的方法来避免反斜杠

:%s/\v(usa)(_)(foo)/\3\2\1

\v ................... very magic
() ................... regex group with no backslash

注意:我们将第二组保留在中间,只需将 1 换成 3

当然,如果您在同一行有其他事件,您应该添加/g


推荐阅读