我無法讓正則運算式僅將鍵值對中的鍵從駝峰大小寫轉換為下劃線字串。
像sed -E 's/\B[AZ]/_\U&/g'這樣的運算式轉換了完整的值,但我想將轉換限制為這里的鍵。
$ echo UserPoolId="eu-west-1_6K6Q2bT9c" | sed -E 's/\B[A-Z]/_\U&/g'
User_Pool_Id=eu-west-1_6_K6_Q2b_T9c
但我想得到User_Pool_Id=eu-west-1_6K6Q2bT9c
uj5u.com熱心網友回復:
這樣做sed有點挑戰性,因為您需要更復雜的正則運算式和更復雜的腳本。也許更好的解決方案是使用外殼的替代設施來隔離您要操作的部分。
string='UserPoolId="eu-west-1_6K6Q2bT9c"'
prefix=${string%%=*}
suffix=${string#"$prefix"}
sed -E -e 's/\B[A-Z]/_\U&/g' -e "s/\$/$suffix/" <<<"$prefix"
Bash 還具有內置的引數擴展,可以將字串的第一個字符轉換為大寫,但這也許足以解決您的直接問題。
uj5u.com熱心網友回復:
使用 GNU awk 將第三個 arg 用于 match() 和 gensub():
$ echo 'UserPoolId="eu-west-1_6K6Q2bT9c"' |
awk 'match($0,/([^=] =)"(.*)"/,a) { $0=gensub(/([[:lower:]])([[:upper:]])/,"\\1_\\2","g",a[1]) a[2]} 1'
User_Pool_Id=eu-west-1_6K6Q2bT9c
我不知道這是否是您在這種情況下想要的,但無論如何:
$ echo 'UserPoolID="eu-west-1_6K6Q2bT9c"' |
awk 'match($0,/([^=] =)"(.*)"/,a) { $0=gensub(/([[:lower:]])([[:upper:]])/,"\\1_\\2","g",a[1]) a[2]} 1'
User_Pool_ID=eu-west-1_6K6Q2bT9c
請注意,ID保留 as_ID并且不會轉換為_I_D.
uj5u.com熱心網友回復:
這可能對您有用(GNU sed):
sed 's/=/&\n/;h;s/\B[[:upper:]]/_&/g;G;s/\n.*\n//' file
在 之后引入換行符=并將結果復制到保留空間。
在需要的地方插入下劃線。
將副本附加到當前行并洗掉中間,留下答案。
uj5u.com熱心網友回復:
如果您只有一個=符號并且您想修改=符號之前的駝峰式大小寫,那么使用 GNUsed您可以迭代直到完成所有替換:
echo UserPoolId="eu-west-1_6K6Q2bT9c" | sed -E ':a;s/([a-z])([A-Z].*=.*)/\1_\2/;ta'
User_Pool_Id=eu-west-1_6K6Q2bT9c
:a如果前一個命令替換了某些內容,則設定 label a,ta分支到 label 。回圈中的命令在等號之前插入小寫和大寫之間的 a 。ass_
在您的示例中,這將首先插入一個_between Userand Pool,然后插入 between Pooland Id。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/450005.html
