我有一个三行的文件。
HelloStackOverflow
ThisIsMyFirstPost
OnThisWebsite
我希望它看起来像这样。
HELLO_STACK_OVERFLOW
THIS_IS_MY_FIRST_POST
ON_THIS_WEBSITE
有没有办法用Vim的替代品来做这个?我现在有这个。
:%s/^\([A-Z][a-z]*\)*\([A-Z][a-z]*\)$/\U\1_\2/g
第一组捕获每行中最后一个单词之前的所有单词,第二组捕获最后一个单词。我可以将反向引用“扩展”到第一组中的多个匹配项,以便将_
放在每个匹配项之后吗?目前,它产生了以下结果。
STACK_OVERFLOW
FIRST_POST
THIS_WEBSITE
(\1
给出最后一个通配符匹配)
1条答案
按热度按时间qkf9rpyu1#
由于在第一个捕获组之后有一个
*
,因此实际上只有最后一个重复才会出现在第一个捕获组中。此外,这种重复将使您无法在短语的前面插入下划线。我会将其设置为
?
而不是*
。其思想是,您只希望捕获短语中第一个单词时的内容(一个单词),但对于输入中的任何其他位置,您不希望在此处匹配任何内容。因此,需要进行一些更改:
*
更改为?
^
应在捕获组内移动,因此?
适用于它。$
应该被删除,否则同一行上不能有多个匹配。这给出: