说我们有一根绳子,就像:
doSomething()我们希望获得:
do_something()做这件事最好的方法是什么?
我读过关于字符串操作的documentation,但是找不到正确的命令组合。
更新
在@anubhava讨论之后,我发现了安装gnu-sed的解决方案:
brew install gnu-sed然后我可以以这样的方式运行脚本:
s="doSomethingElse()"; gsed 's/[[:upper:]]/_\L&/g' <<< "$s"输出: do_something_else()
发布于 2015-10-23 14:20:48
使用gnu-sed,您可以:
s='doSomethingElse()'
sed 's/[[:upper:]]/_\L&/g' <<< "$s"
do_something_else()或者使用带有non-gnu-sed (BSD)管道的tr
sed 's/[[:upper:]]/_&/g' <<< "$s" | tr [[:upper:]] [[:lower:]]
do_something_else()或者使用perl
perl -pe 's/[[:upper:]]/_\L$&/g' <<< "$s"
do_something_else()或者使用gnu-awk
awk -v RS=[[:upper:]] -v ORS= '1; RT{printf "_%s", tolower(RT)}' <<< "$s"
do_something_else()发布于 2015-10-23 14:32:05
在bash 4中:
$ s="doSomethingElse()"
$ while [[ $s =~ [[:lower:]]([[:upper:]]) ]]; do
> s=${s/[[:upper:]]/_${BASH_REMATCH[1],,}}
> done
$ echo "$s"
do_something_else()首先,while循环尝试匹配一个小写字符,然后紧跟大写字符,并捕获匹配的大写字符。参数展开用下划线和捕获的大写字符(由,,运算符转换为小写)替换字符串中的第一个大写字符。这些进程会重复,直到找不到更低/更高的对为止。
如果bash允许捕获模式中的组,则假设如下
s=${s//([[:lower:]])([[:upper:]])/${BASH_PATMATCH[1]}_${BASH_PATMATCH[2],,}}不用循环就能工作。因此,我们需要额外的步骤,使用正则表达式匹配一次匹配,以捕获要降低的字母。
https://stackoverflow.com/questions/33304620
复制相似问题