最近的工作有一个需求,需要利用linux shell脚本将_或-作连字符的变量名字符串转为驼峰命名法(camel-case)的字符串,其实吧,'_'做连字符的命名方式有专门的名字,蛇形命名法(snake-case).'-'做连字符的命名方式也有专门的名字,脊柱命名法(spinal-case),也有叫kebab-case(kebab-烤肉串,也挺形象的).关于这些命名方式的由来本文未尾的参考资料1 2 3都有详细说明,我也是这次为了解决这个问题查资料才知道这些名词,以前孤陋寡闻了。
通过搜索引擎找到stackoverflow上找到了下面这个帖子4

与我的需求基本一样,是想把一个脊柱命名法(spinal-case)字符串转换为驼峰命名法(camel-case)的字符串。答主给了3个解决方案

对于上面三个方案我都做了测试,在linux(bash),win32/msys2下三个方案都能正确转换,但是在macOS(Big Sur 11.4)下第二,三方案可以正确转换,第一个方案(GNU sed)并不有效,不论是用zsh还是bash,如下图,我初步分析认为是我现在用的这个版本的sed不太对或某些开头没打开导致不能识别\U控制码:

根据上面的解决方案整理一下,用来将以'-','_'连接的变量名字符串统一转为驼峰命名法的变量名,以下为三种解决方案,只是原方案的基础上增加了对'_'的支持,将'_'与‘-’一样视为连接符
GNU sed(macOS下可能无效)
$ echo hello-world_tom | sed -r 's/(^|-|_)(\w)/\U\2/g'
HelloWorldTom
Perl
$ echo hello-world_tom | perl -pe 's/(^|-|_)(\w)/\U\2/g'
HelloWorldTom
Native Bash
$ to_camel_case() {
IFS=-_ read -ra str <<<"$1"
printf '%s' "${str[@]^}"
}
$ to_camel_case "hello-world_tom"
HelloWorldTom
对于MacOS下zsh无效

博客介绍了如何使用Linux Shell脚本将使用下划线和短横线连接的变量名(蛇形命名法snake-case和脊柱命名法spinal-case)转换为驼峰命名法(camel-case)。文中提到了在Stack Overflow找到的三个解决方案,分别使用了GNUsed、Perl和纯Bash的方法,并指出在macOS环境下,GNUsed方案可能无效。文章还提供了一个针对macOS环境的修正后的Bash函数,以确保在各种操作系统上都能正确转换。
255

被折叠的 条评论
为什么被折叠?



