Regex将所有超过某个模式的内容更改为大写

Regex将所有超过某个模式的内容更改为大写,regex,vim,uppercase,Regex,Vim,Uppercase,我有一个xml文件,它的值如下 JOBNAME="JBDSR14353_Some_other_Descriptor" 我正在寻找一个表达式,它将通过文件并将引号中的所有字符更改为大写字母。是否有一个正则表达式可以搜索JOBNAME=“引号内的任何内容”并将其更改为大写?或者是一个查找JOBNAME=并将该行中的所有内容更改为大写字母的命令?我知道可以只搜索JOBNAME=然后在vim中使用VU命令将行抛出大写存储到宏并运行该宏,但我想知道是否有一种方法可以使用正则表达式来完成此操作???您可

我有一个xml文件,它的值如下

 JOBNAME="JBDSR14353_Some_other_Descriptor"

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

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

:g/JOBNAME/norm! gU_
这将在与
JOBNAME

如果同一行中还有其他内容您不想大写,这里有一个解决方案,只针对引号中的单词:

:g/JOBNAME/norm! f"gU;

f“
转到下一个引号。
gU
用一个动作大写。使用的动作是
搜索下一个
(重复最后一个
f
命令)。

要使用替换,可以使用
\U
原子,它将后面的所有内容都大写

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

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

这里有一个替换为
:替换
,这是您最初想要的。当行中有其他文本时,这比@Zach的解决方案更有效:

:%s/JOBNAME="[^"]\+"/\U&/g
  • “[^”]\+”
    匹配带引号的文本(非贪婪地只匹配内部的非引号,以处理一行中的多个引号)
  • \U
    将替换字母的其余部分改为大写
  • 为简单起见,整个匹配(
    &
    )在这里大写,但也可以使用捕获组(
    \(…\)
    ),或使用
    \zs
    进行匹配限制

为什么你更喜欢
[^”]\+
而不是非贪婪的匹配
\{-}
?@FDinoff:这里没关系;在更复杂的模式中,它可以。谢谢你,这也很有效!即使Zachs的答案也解决了我的问题,我还是把你的答案改成了正确的答案,因为我的问题需要一个Regex.Nice。只是一个建议,但我总是使用
normal,以便忽略任何映射。(加上
:help case
上的一些额外信息)谢谢,这也很有效。如果想将其转换为sed命令,比如说将其放入脚本中使用,会有很大不同吗?正如现在编写的那样,它给出了一个未终止的s命令sed-i's/JOBNAME=“zs.*\ze”/\U&“file name”\U我尝试将/g添加到末尾,它没有抱怨,但是它没有更改文件中的任何内容。@Archer783
\zs
\ze
是vim的具体名称,请参阅。Ingo Karkat的解决方案将与sed合作