从字符串中查找并替换大写字符并保持原始匹配

时间:2019-02-20 05:10:32

标签: bash sed tr

我需要将字符串“ TestString”更改为这种格式“ [tT] est [sS] tring”。

我尝试使用sed

testString="TestString" sed 's/\([[:upper:]]\)/[&\1]/g' <<< "$testString" | tr '[[:upper:]]' '[[:lower:]]'

结果是: [tt]est[ss]tring

我想寻求您的帮助,以找到使大括号内的第二个字符变为大写的方法。

谢谢。

1 个答案:

答案 0 :(得分:3)

您可以为此使用sed,而不必使用tr。以下内容适用于GNU版本

sed -E 's/([[:upper:]])/[\L\1\u&]/g' <<< "$testString"

了解其工作原理

s/([[:upper:]])/[\L\1\u&]/g
#  ^^^^^^^^^^^              Match the uppercase character
#                ^^^^       lower case the matched letter
#                    ^^^^   upper case the matched letter

您也可以执行s/([[:upper:]])/[\L\1\u\1]/g,因为\1&都引用了搜索模式中的匹配组。

MacOS(FreeBSD)sed默认不支持大小写转换功能\L\u。您可以使用brew install gnu-sed安装它并调用gsed来启动它。