如何使用 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
但是,这一次只能替换一个 _
字符。我希望搜索和替换执行如下操作:
- 识别所有包含字符串
public function [gs]et
. 的行
- 在这些行中,执行以下搜索并替换
: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)
对于以 public function get_method_name()
开头的行,我正在尝试将某些函数的方法名称的大小写从 lowercase_with_underscores
更改为 lowerCamelCase
。我正在努力一步完成这件事。
到目前为止,我使用了以下
:%s/\(get\)\([a-zA-Z]*\)_\(\w\)/\u/g
但是,这一次只能替换一个 _
字符。我希望搜索和替换执行如下操作:
- 识别所有包含字符串
public function [gs]et
. 的行
- 在这些行中,执行以下搜索并替换
: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)