正则表达式将所有过去的某个模式更改为大写

时间:2014-09-03 18:21:27

标签: regex vim uppercase

我有一个xml文件,其值类似于

 JOBNAME="JBDSR14353_Some_other_Descriptor"

我正在寻找一个表达式,它将遍历文件并将引号中的所有字符更改为大写字母。是否有正则表达式将搜索JOBNAME =“引号内的任何内容”并将其更改为大写?或者一个命令,它将找到JOBNAME =并将该行的所有内容更改为大写字母?我知道可以只搜索JOBNAME =然后在vim中使用VU命令将行抛出到大写存储到宏并运行它,但我想知道是否有办法用正则表达式完成??

3 个答案:

答案 0 :(得分:8)

您可以使用:g命令在与模式匹配的行上执行命令:

:g/JOBNAME/norm! gU_

这会执行gU_,它会对匹配JOBNAME

的所有行上的所有字母进行大写

如果在同一行上还有其他东西你不想大写,这里只有引号中的单词的解决方案:

:g/JOBNAME/norm! f"gU;

f"转到下一个引用。 gU以动议为首都。使用的动作是;,它会搜索下一个"(重复上一个f命令)。

答案 1 :(得分:8)

这里是:substitute的替代方案,正如您原先打算的那样。当行中有其他文字时,这比@ Zach与gU_的解决方案更有效:

:%s/JOBNAME="[^"]\+"/\U&/g
  • "[^"]\+"与引用的文字匹配(非贪婪地仅匹配内部的非引号,以处理行中的多个引号)
  • \U转换替换大写的剩余部分
  • 为简单起见,整个匹配(&)在这里是大写的,但也可以使用捕获组\(...\)),或者匹配限制{{1 }}

答案 2 :(得分:2)

要使用替换执行此操作,您可以使用\U原子,使其后面的所有内容都大写。

:%s/JOBNAME="\zs.*\ze"/\U&

\zs\ze标记比赛的开始和结束,&是整场比赛。这意味着只替换引号之间的部分。