[英]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.