Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Bash脚本:查找并替换字符串上的大写字符_String_Macos_Bash_Replace_Terminal - Fatal编程技术网

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

String Bash脚本:查找并替换字符串上的大写字符,string,macos,bash,replace,terminal,String,Macos,Bash,Replace,Terminal,说我们有一个字符串,比如: doSomething() 我们希望获得: do_something() 最好的方法是什么? 我读过字符串操作,但找不到正确的命令组合 更新 在@anubhava讨论之后,我找到了安装gnu sed的解决方案: brew install gnu-sed 然后我可以这样运行脚本: s="doSomethingElse()"; gsed 's/[[:upper:]]/_\L&/g' <<< "$s"

说我们有一个字符串,比如:

doSomething()
我们希望获得:

do_something()
最好的方法是什么?
我读过字符串操作,但找不到正确的命令组合

更新 在@anubhava讨论之后,我找到了安装gnu sed的解决方案:

brew install gnu-sed
然后我可以这样运行脚本:

s="doSomethingElse()"; gsed 's/[[:upper:]]/_\L&/g' <<< "$s"

s=“doSomethingElse()”;gsed的/[:upper:]/\L&/g'使用
gnu-sed
可以执行以下操作:

s='doSomethingElse()'

sed 's/[[:upper:]]/_\L&/g' <<< "$s"
do_something_else()
或者使用
perl

perl -pe 's/[[:upper:]]/_\L$&/g' <<< "$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],,}}

可以在没有循环的情况下工作。实际上,我们需要额外的步骤,使用正则表达式一次匹配一个匹配项来捕获要小写的字母。

我在mac下使用iTerm(而且awk对我不起作用)
iTerm
只是一个终端。OSX默认不附带gnu实用程序。在我的OSX上(我测试了这两个命令),我已经使用
自制
安装了gnu-sed和gnu-awk。好的,但是在这种情况下,其他用户必须安装“gnu-sed”才能正确运行OSX
sed
上的脚本。你可以使用
sed/[:upper:]/\uu&/g',非常感谢Avinash:)我一直在尝试使用Bash 4 case-modification,但到目前为止,他们都失败了。(我预计至少需要两次不同的扩张。)我想知道是否可能只进行PE和重新分配。
$ s="doSomethingElse()"
$ while [[ $s =~ [[:lower:]]([[:upper:]]) ]]; do   
>     s=${s/[[:upper:]]/_${BASH_REMATCH[1],,}}
> done
$ echo "$s"
do_something_else()
s=${s//([[:lower:]])([[:upper:]])/${BASH_PATMATCH[1]}_${BASH_PATMATCH[2],,}}