【发布时间】:2021-11-15 06:36:27
【问题描述】:
我有这个工作 bash one-liner,它使用 sed 将 PascalCase 转换为 kebab-case:
foo="TestPascalCaseString"
echo $foo | sed -r 's/([a-z0-9])([A-Z])/\1-\2/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
用连字符替换大写字母,但我不知道如何保留它正在替换的大写字符。
【问题讨论】:
-
你不想使用
sed太糟糕了,因为重写它以在所有平台上工作都是微不足道的:sed 's/\([a-z0-9]\)\([A-Z]\)/\1-\2/g' -
@thatotherguy:我建议添加
; s/\(.*\)/\L\1/,但我不知道它是否适用于所有平台。 -
@thatotherguy 谢谢,我已经确认
's/\([a-z0-9]\)\([A-Z]\)/\1-\2/g'在我能够测试的所有平台(macOS 11 和 10.15,ubuntu 18.04 和 20.04)上都可以在没有-r标志的情况下工作,我会采用这个解决方案。我赞成您的评论,但我应该:a) 重写问题以声明我 am 可以使用不需要-r标志的sed解决方案,然后让您回答题?或者 b) 保留问题原样,以防有人发布可能对未来访客有帮助的非sed解决方案? -
您可以接受最初发布的问题的答案
-
@Cyrus
\L在替换中是一个 GNU sed 扩展。