如何在Bash中不使用sed实现跨平台的PascalCase转kebab-case
方案1:最小改动跨平台sed兼容方案
macOS自带的BSD sed扩展正则参数为-E,而Linux、WSL默认使用的GNU sed同时兼容-r和-E参数,只需将原命令中的-r替换为-E即可全平台原生运行,无需安装额外依赖:
foo="TestPascalCaseString" echo "$foo" | sed -E 's/([a-z0-9])([A-Z])/\1-\2/g' | tr '[:upper:]' '[:lower:]'
运行输出一致为:test-pascal-case-string
方案2:纯Bash实现(无外部依赖,性能更高)
如果不想调用sed、tr等外部命令,可以用纯Bash逻辑实现,兼容所有主流平台默认Bash版本:
pascal_to_kebab() { local input="$1" output="" first=1 for ((i=0; i<${#input}; i++)); do c="${input:i:1}" if [[ $c =~ [A-Z] ]]; then ((first)) || output+="-" output+="${c,,}" else output+="$c" fi first=0 done echo "$output" } # 调用示例 foo="TestPascalCaseString" pascal_to_kebab "$foo"
如果需要兼容旧版macOS默认自带的Bash 3版本,把${c,,}替换为$(tr '[:upper:]' '[:lower:]' <<< "$c")即可。
内容的提问来源于stack exchange,提问作者Employee
相关产品推荐
相关产品推荐

