Regex 将一行中的搜索模式切换为titlecase,保留行的其余部分不变

Regex 将一行中的搜索模式切换为titlecase,保留行的其余部分不变,regex,vim,sed,Regex,Vim,Sed,我想转换以下行中的大写单词: <h3><a href="#ch15Toc" name="ch15Txt"></a>XV. THE THOUSAND AND ONE GOALS</h3> XV。千年目标 使用sed或ved(vim ed)滴定酶。通过谷歌搜索找到了将整行标题化的方法,而不仅仅是匹配模式搜索的文本(一行中的部分文本) 我想这可能有用,但没有骰子: sed -ri '/<h3>/s/([A-Z ]*)<\/h3>

我想转换以下行中的大写单词:

<h3><a href="#ch15Toc" name="ch15Txt"></a>XV. THE THOUSAND AND ONE GOALS</h3>
XV。千年目标
使用sed或ved(vim ed)滴定酶。通过谷歌搜索找到了将整行标题化的方法,而不仅仅是匹配模式搜索的文本(一行中的部分文本)

我想这可能有用,但没有骰子:

sed -ri '/<h3>/s/([A-Z ]*)<\/h3>/\L\1\END<\/h3>/;s/[[:graph:]]*/\u&/g'
sed-ri'//s/([A-Z]*)//\L\1\END/;s/[[:graph:][]*/\u&/g'
在将搜索模式转换为小写后(当然没有问题),我想我可能可以用类似的方式将相同的文本转换为标题库,但仍然没有爱(我实际上认为这足够有效,所以我不确定为什么不能):

sed-ri的/([IVX]{1,6}\.]{1,})([a-z])/\1\u\2/g'

有没有办法只编辑标题库模式搜索中的文本,而不编辑整行文本中的所有单词?我想知道为什么没有一个\T来赞美\L和\u case命令。当然很方便。

这很有效,而且很容易重新转换罗马NUM。之后改为大写。我会看看那些我完全不熟悉的ved选项。实际上我有点快。此命令还更改了行中没有标记的行上大写单词的大小写,这就是为什么我在第一次sed尝试中使用了分隔符,并在第二次sed搜索模式中包含了一个结束锚标记,以确保只有具有或将受到影响的行。您的命令是否有快速修改,以将搜索范围限制为带有或标记的行?@nanker您可以首先获取
之间的内容,并在其上应用相同的模式,是我提供一个新命令,还是您自己先尝试<代码>:hs/\=
可能会有帮助。@nanker我在回答中加上了。
%s/\v<\zs(\u)(\u*)\ze>/\1\L\2/g
%s/\v<\zs(\u)(\u*)\ze>/\1\L\2/g
<h3><a href="#ch15Toc" name="ch15Txt"></a>Xv. The Thousand And One Goals</h3>
%s#<h3>\zs.*\ze</h3>#\=substitute(submatch(0), '\v<\zs(\u)(\u*)\ze>','\1\L\2',"g")#