[英]Bash script: find and replace uppercase character on a string
说我们有一个像这样的字符串:
doSomething()
我们希望获得:
do_something()
做这个的最好方式是什么?
我已经阅读了有关字符串操作的 文档 ,但我找不到正确的命令组合..
在@anubhava讨论之后,我找到安装gnu-sed的解决方案:
brew install gnu-sed
然后我可以用这种方式运行脚本:
s="doSomethingElse()"; gsed 's/[[:upper:]]/_\L&/g' <<< "$s"
输出: do_something_else()
使用gnu-sed
你可以这样做:
s='doSomethingElse()'
sed 's/[[:upper:]]/_\L&/g' <<< "$s"
do_something_else()
或者使用带有tr
non-gnu-sed (BSD)
管道:
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()
在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],,}}
可以没有循环工作。 因此,我们需要使用正则表达式的额外步骤一次匹配一个匹配以捕获要小写的字母。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.