如何使用VI删除匹配正则表达式的行上出现的字符?

时间:2015-04-21 20:58:26

标签: regex vim replace vi

对于以lowercase_with_underscores开头的行,我正在尝试将某些函数的方法名称从lowerCamelCase更改为public function get_method_name()。我很难一步完成这件事。

到目前为止,我使用了以下

:%s/\(get\)\([a-zA-Z]*\)_\(\w\)/\1\2\u\3/g

但是,这一次只能替换一个_个字符。我希望它能够搜索和替换以下内容:

  1. 标识包含字符串public function [gs]et
  2. 的所有行
  3. 在这些行中,执行以下搜索并替换:s/_\(\w\)/\u\1/g
  4. 编辑:

    假设我有行get_method_name()set_method_name($variable_name),我只想更改方法名称而不是变量名称,我该怎么做? get_method_name()当然更简单,但我想要一个适用于单个命令的解决方案。我已根据下面列出的解决方案使用:%g/public function [gs]et/ . . .来解决get_method_name()案例,但遗憾的是不是set_method_name($variable_name)案例。

3 个答案:

答案 0 :(得分:4)

如果我理解正确,我不知道为什么你尝试过的东西没有用,但你可以使用g在匹配模式的行匹配上执行普通模式命令。

您的示例如下:

:%g/public function [gs]et/:s/_\(\w\)/\u\1/g

更新

为了仅匹配方法名称,我们可以使用在第一个$之前只有方法名称的事实,因为这看起来像是PHP。

为此,我们可以使用负面的后视,@<!

:%g/public function [gs]et/:s/\(\$.\+\)\@<!_\(\w\)/\u\2/g

对于任何@<!,此后面会显示$后跟任意数量的字符,如果找不到_\(\w\),则仅匹配$

奖励积分(?):

要对多个缓冲区执行此操作,请在bufdo

前面加%g

答案 1 :(得分:0)

要让vi在所有行中替换悲伤,请在文件中

:1, $ s/sad/happy/g

:1, $命令之前的sed指示vi在文件的每一行上执行命令。)

答案 2 :(得分:0)

您想要使用带有表达式(:h sub-replace-expression

的替代品

匹配您要处理的完整字符串,然后将该字符串传递给第二个替换命令以实际更改字符串

:%s/\(get\|set\)\zs_\w\+/\=substitute(submatch(0), '_\([A-Za-z]\)', '\U\1', 'g')

上运行上述内容
get_method_name($variable_name)
set_method_name($variable_name)

返回

getMethodName($variable_name)
setMethodName($variable_name)