[英]How to use VI to remove ocurance of character on lines matching regex?
我正在尝试将某些函数的方法名称的lowercase_with_underscores
从lowercase_with_underscores
更改为lowerCamelCase
,以public function get_method_name()
开头的行。 我正在努力一步完成这项工作。
到目前为止,我已经使用了以下内容
:%s/\(get\)\([a-zA-Z]*\)_\(\w\)/\1\2\u\3/g
但是,这一次仅替换一个_
字符。 我想要的是搜索和替换,它执行以下操作:
public function [gs]et
。 :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.