首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash脚本:查找并替换字符串上的大写字符

Bash脚本:查找并替换字符串上的大写字符
EN

Stack Overflow用户
提问于 2015-10-23 14:18:31
回答 2查看 485关注 0票数 3

说我们有一根绳子,就像:

代码语言:javascript
复制
doSomething()

我们希望获得:

代码语言:javascript
复制
do_something()

做这件事最好的方法是什么?

我读过关于字符串操作的documentation,但是找不到正确的命令组合。

更新

在@anubhava讨论之后,我发现了安装gnu-sed的解决方案:

代码语言:javascript
复制
brew install gnu-sed

然后我可以以这样的方式运行脚本:

代码语言:javascript
复制
s="doSomethingElse()"; gsed 's/[[:upper:]]/_\L&/g' <<< "$s"

输出: do_something_else()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-23 14:20:48

使用gnu-sed,您可以:

代码语言:javascript
复制
s='doSomethingElse()'

sed 's/[[:upper:]]/_\L&/g' <<< "$s"
do_something_else()

或者使用带有non-gnu-sed (BSD)管道的tr

代码语言:javascript
复制
sed 's/[[:upper:]]/_&/g' <<< "$s" | tr [[:upper:]] [[:lower:]]
do_something_else()

或者使用perl

代码语言:javascript
复制
perl -pe 's/[[:upper:]]/_\L$&/g' <<< "$s"
do_something_else()

或者使用gnu-awk

代码语言:javascript
复制
awk -v RS=[[:upper:]] -v ORS= '1; RT{printf "_%s", tolower(RT)}' <<< "$s"
do_something_else()
票数 4
EN

Stack Overflow用户

发布于 2015-10-23 14:32:05

bash 4中:

代码语言:javascript
复制
$ s="doSomethingElse()"
$ while [[ $s =~ [[:lower:]]([[:upper:]]) ]]; do   
>     s=${s/[[:upper:]]/_${BASH_REMATCH[1],,}}
> done
$ echo "$s"
do_something_else()

首先,while循环尝试匹配一个小写字符,然后紧跟大写字符,并捕获匹配的大写字符。参数展开用下划线和捕获的大写字符(由,,运算符转换为小写)替换字符串中的第一个大写字符。这些进程会重复,直到找不到更低/更高的对为止。

如果bash允许捕获模式中的组,则假设如下

代码语言:javascript
复制
s=${s//([[:lower:]])([[:upper:]])/${BASH_PATMATCH[1]}_${BASH_PATMATCH[2],,}}

不用循环就能工作。因此,我们需要额外的步骤,使用正则表达式匹配一次匹配,以捕获要降低的字母。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33304620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档