我正在做这样的事情:
echo 'foo_bar_baz=foo_bar_baz' | sed -r 's/_([[:alnum:]])/\U\1/g'
结果是:
fooBarBaz=fooBarBaz
有没有办法得到
fooBarBaz=foo_bar_baz
代替?我试着这么做,不贪婪:
echo 'foo_bar_baz=foo_bar_baz' | sed -r 's/([^=].*?)_([[:alnum:]])/\1\U\2/g'
但结果是:
foo_bar_baz=foo_barBaz
我需要的是从:
foo_bar_baz=foo_bar_baz
致:
fooBarBaz=foo_bar_baz
最佳答案
你可以用
s='foo_bar_baz=foo_bar_baz'
sed -E ':a;s/^([^=_]*)_([[:alnum:]])/\1\U\2/g; ta' <<< "$s"
# => fooBarBaz=foo_bar_baz
查看online
sed
demo细节
:a
-如果替换成功,定义要跳转到的标签a
-查找s/^([^=_]*)_([[:alnum:]])/\1\U\2/g
-字符串开始^
-第1组(([^=_]*)
在替换模式中):除\1
和=
之外的任何0+字符_
-下划线_
-第2组(([[:alnum:]])
在替换模式中):一个字母数字字符\2
-第一组值,然后是大写的第二组值\1\U\2
-ta
是一个分支命令,使sed返回到t
标签并重复匹配。