bash - 从字符串中查找并替换大写字符并保留原始匹配项

标签 bash sed tr

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

我尝试使用sed :

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

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

我想请求您帮助找到一种方法,使括号内的第二个字符大写。

谢谢。

最佳答案

您只需使用 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 来启动它。

关于bash - 从字符串中查找并替换大写字符并保留原始匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54779234/

相关文章:

regex - 使用 sed 一个接一个地添加一个文本 block

mysql - Bash:当服务器出现故障时关闭 MySQL 连接

linux - 在 CSV 的列中搜索模式并使用 sed 命令替换同一行中的另一个模式

linux - 使用 tr 去除字符但保留换行符

bash - 我正在尝试将 tr 与多个集合一起使用,但不确定如何

bash - 无法获取 Web 服务器的 PID

bash 将整数添加到字符串

linux - 如何在 linux (cent os) 中通过 sed 编辑特定行并替换文本

bash 从文件中 sed 一个带引号的字符串,但只在第 N 行

bash - 在终端中格式化输出,删除空行并转换逗号