将一行中的搜索模式切换为标题,使行的剩余部分保持不变

时间:2014-05-19 09:35:42

标签: regex vim sed

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

<h3><a href="#ch15Toc" name="ch15Txt"></a>XV. THE THOUSAND AND ONE GOALS</h3>

使用sed或ved(vim ed)进行标题。谷歌搜索引出了Titlecase整行的方式,但不仅仅是与模式搜索匹配的文本(一行中的部分文本)

认为这可行,但没有骰子:

sed -ri '/<h3>/s/([A-Z ]*)<\/h3>/\L\1\END<\/h3>/;s/[[:graph:]]*/\u&/g'

将搜索模式转换为LOWERCASE(当然没有probs管理那个),我想我可能会用同样的东西将相同的文本转换为Titlecase,但仍然没有爱(我实际上认为这对于工作,所以我不确定为什么不这样做:

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

是否有某种方法可以仅将模式搜索中的文本编辑为Titlecase而不是整行文本中的所有单词?我想知道为什么没有\ T来赞美\ L和\ u case命令。当然会很方便。

1 个答案:

答案 0 :(得分:0)

%s/\v<\zs(\u)(\u*)\ze>/\1\L\2/g

在vim中,执行此命令后,您的行将变为:

<h3><a href="#ch15Toc" name="ch15Txt"></a>Xv. The Thousand And One Goals</h3>

vim具有substitute()和其他强大的功能,如果您的要求足够复杂,那么在匹配的文本上进行替换非常方便。 :s/.../\=(expression here)/

仅在<h3>....</h3>中进行替换:

%s#<h3>\zs.*\ze</h3>#\=substitute(submatch(0), '\v<\zs(\u)(\u*)\ze>','\1\L\2',"g")#