在没有 sed 的情况下将 bash 中的 PascalCase 字符串转换为 kebab-case
Converting PascalCase string to kebab-case in bash without sed
我有这个有效的 bash 单行代码,它使用 sed 将 PascalCase 转换为 kebab-case:
foo="TestPascalCaseString"
echo $foo | sed -r 's/([a-z0-9])([A-Z])/-/g' | tr '[:upper:]' '[:lower:]'
output: test-pascal-case-string
但是,这用于需要在常见 Linux 发行版、Windows 上的 WSL 以及新旧版本的 macOS 之间移植的脚本中。
在旧版本的 macOS 上,脚本失败并显示:
sed: illegal option -- r
我已经为任何 macOS 版本的用户解决了这个问题,首先让他们 brew install gsed
,然后让脚本使用 gsed
而不是 sed
。这可行,但是 Linux 用户没有 gsed
二进制文件,因此他们需要将脚本改回使用 sed
.
所以我正在尝试使用纯 bash 解决方案或任何其他在所有平台上一致工作的工具来重新创建它,以消除对先决条件工具安装或脚本修改的需要。
我试过bash参数替换:
foo="TestPascalCaseString"
echo ${foo//[A-Z]/-}
output: -est-ascal-ase-tring
用连字符替换大写字母,但我不知道如何保留它替换的大写字符。
使用循环、正则表达式和 bash 版本 >= 3.0:
foo="TestPascalCaseString"
while [[ "$foo" =~ (.*[a-z0-9])([A-Z].*) ]] && foo="${BASH_REMATCH[1]}-${BASH_REMATCH[2]}"; do
: # do nothing
done
echo "${foo,,}"
输出:
test-pascal-case-string
使用 perl
(我 99% 确定 OS X 仍然附带):
$perl -ne 'print lc s/[[:lower:]\d]\K[[:upper:]]/-$&/rg' <<<"TestPascalCaseString"
test-pascal-case-string
我有这个有效的 bash 单行代码,它使用 sed 将 PascalCase 转换为 kebab-case:
foo="TestPascalCaseString"
echo $foo | sed -r 's/([a-z0-9])([A-Z])/-/g' | tr '[:upper:]' '[:lower:]'
output: test-pascal-case-string
但是,这用于需要在常见 Linux 发行版、Windows 上的 WSL 以及新旧版本的 macOS 之间移植的脚本中。
在旧版本的 macOS 上,脚本失败并显示:
sed: illegal option -- r
我已经为任何 macOS 版本的用户解决了这个问题,首先让他们 brew install gsed
,然后让脚本使用 gsed
而不是 sed
。这可行,但是 Linux 用户没有 gsed
二进制文件,因此他们需要将脚本改回使用 sed
.
所以我正在尝试使用纯 bash 解决方案或任何其他在所有平台上一致工作的工具来重新创建它,以消除对先决条件工具安装或脚本修改的需要。
我试过bash参数替换:
foo="TestPascalCaseString"
echo ${foo//[A-Z]/-}
output: -est-ascal-ase-tring
用连字符替换大写字母,但我不知道如何保留它替换的大写字符。
使用循环、正则表达式和 bash 版本 >= 3.0:
foo="TestPascalCaseString"
while [[ "$foo" =~ (.*[a-z0-9])([A-Z].*) ]] && foo="${BASH_REMATCH[1]}-${BASH_REMATCH[2]}"; do
: # do nothing
done
echo "${foo,,}"
输出:
test-pascal-case-string
使用 perl
(我 99% 确定 OS X 仍然附带):
$perl -ne 'print lc s/[[:lower:]\d]\K[[:upper:]]/-$&/rg' <<<"TestPascalCaseString"
test-pascal-case-string