繁体   English   中英

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

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

我正在尝试将某些函数的方法名称的lowercase_with_underscoreslowercase_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. 在这些行上,执行以下搜索并替换:s/_\\(\\w\\)/\\u\\1/g

编辑:

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

如果我对您的理解正确,我不知道为什么您尝试过的事情没有奏效,但是您可以使用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前面

要用vi在文件的所有行上用happy代替sad:

:1, $ s/sad/happy/g

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

您想在表达式中使用替换项( :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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM