我有一个xml文件,其值类似于
JOBNAME="JBDSR14353_Some_other_Descriptor"
我正在寻找一个表达式,它将遍历文件并将引号中的所有字符更改为大写字母。是否有正则表达式将搜索JOBNAME =“引号内的任何内容”并将其更改为大写?或者一个命令,它将找到JOBNAME =并将该行的所有内容更改为大写字母?我知道可以只搜索JOBNAME =然后在vim中使用VU命令将行抛出到大写存储到宏并运行它,但我想知道是否有办法用正则表达式完成??
答案 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
标记比赛的开始和结束,&
是整场比赛。这意味着只替换引号之间的部分。