如何将'VW_ABCD_EF_GHIJ_KLM_...'格式字符串转为'AbcdEfGhjKlm...'
字符串格式转换方案
针对将VW_ABCD_EF_GHIJ_KLM这类格式的字符串转换为AbcdEfGhijKlm的需求,提供以下几种实现方式:
方式一:sed + awk 组合处理
利用Bash参数扩展转小写,sed去除前缀,awk处理下划线后的字符大写:
s=VW_ABCD_EF_GHIJ_KLM echo "${s,,}" | sed 's/^vw_//' | awk '{gsub(/_./, toupper(substr($0, RSTART+1, 1))); print}'
步骤说明:
${s,,}:将变量所有字符转为小写,得到vw_abcd_ef_ghij_klmsed 's/^vw_//':移除开头的vw_前缀,得到abcd_ef_ghij_klmawk命令:全局匹配_加单个字符的模式,将_后的字符转大写并删除_
方式二:纯sed循环替换
通过sed的标签循环实现批量替换:
s=VW_ABCD_EF_GHIJ_KLM echo "${s,,}" | sed -e 's/^vw_//' -e ':loop' -e 's/_\([a-z]\)/\U\1/g' -e 't loop'
步骤说明:
:loop定义循环入口标签s/_\([a-z]\)/\U\1/g:匹配第一个_后的小写字母,将其转大写并删除_t loop:如果发生替换,回到loop标签继续处理,直到所有_都被处理完
方式三:纯Bash内置处理(无外部工具)
完全依赖Bash的参数扩展和循环实现,效率更高:
s=VW_ABCD_EF_GHIJ_KLM temp="${s,,#vw_}" while [[ "$temp" == *_* ]]; do underscore_pos=$(expr index "$temp" _) temp="${temp/_?/${temp:underscore_pos:1^^}${temp:underscore_pos+1}}" done echo "$temp"
步骤说明:
${s,,#vw_}:先转小写,再移除开头的vw_前缀- 循环检测字符串中是否还有
_,每次找到_的位置后,将其后的字符转大写,拼接剩余部分,直到无_为止
内容的提问来源于stack exchange,提问作者canellas
相关产品推荐
相关产品推荐

