最近的工作有一个需求,需要利用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无效