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