我正在做这样的事情:

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标签并重复匹配。

10-07 23:03