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

How to use VI to remove ocurance of character on lines matching regex?

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

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

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

但是,这一次只能替换一个 _ 字符。我希望搜索和替换执行如下操作:

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

编辑:

假设我有行 get_method_name()set_method_name($variable_name) 并且我只想更改方法名称的大小写而不是变量名称,我该怎么做? get_method_name() 当然更简单,但我想要一个在单个命令中适用于两者的解决方案。我已经能够根据下面列出的解决方案使用 :%g/public function [gs]et/ . . . 来解决 get_method_name() 的情况,但不幸的是 set_method_name($variable_name) 的情况。

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

您的示例类似于:

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

更新:

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

为此,我们可以使用负向回顾,@<!:

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

这将在 @<! 后面查找任何 $ 后跟任意数量的字符,并且仅在未找到 $ 时匹配 _\(\w\)

奖励积分(?):

要为多个缓冲区执行此操作,请在 %g

前面添加一个 bufdo

vi 将文件中所有行的悲伤替换为快乐:

:1, $ s/sad/happy/g

(是sed命令前的:1, $指示vi对文件中的每一行执行该命令。)

您想使用表达式 (:h sub-replace-expression)

的替代项

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

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

运行 以上

get_method_name($variable_name)
set_method_name($variable_name)

returns

getMethodName($variable_name)
setMethodName($variable_name)