仅在角色之前进行各种替换

Fáb*_*oro 3 regex bash awk sed

我正在做这样的事情:

echo 'foo_bar_baz=foo_bar_baz' | sed -r 's/_([[:alnum:]])/\U\1/g'
Run Code Online (Sandbox Code Playgroud)

并得到结果:

fooBarBaz=fooBarBaz
Run Code Online (Sandbox Code Playgroud)

有办法fooBarBaz=foo_bar_baz代替吗?

我试图做到这一点,非贪婪:

echo 'foo_bar_baz=foo_bar_baz' | sed -r 's/([^=].*?)_([[:alnum:]])/\1\U\2/g'
Run Code Online (Sandbox Code Playgroud)

但是结果是这样的:

foo_bar_baz=foo_barBaz
Run Code Online (Sandbox Code Playgroud)

我需要从中进行转换:

foo_bar_baz=foo_bar_baz
Run Code Online (Sandbox Code Playgroud)

至:

fooBarBaz=foo_bar_baz
Run Code Online (Sandbox Code Playgroud)

Rav*_*h13 5

编辑:添加更多的通用解决方案,也将适用于3个以上的值=

awk '
BEGIN{
  FS=OFS="="
}
{
  num=split($1,array,"_")
  for(i=2;i<=num;i++){
    val=(val?val:"")toupper(substr(array[i],1,1)) substr(array[i],2)
  }
  $1=array[1] val
  val=""
}
1
'  Input_file
Run Code Online (Sandbox Code Playgroud)

对于,这应该是一件容易的事awk

echo 'foo_bar_baz=foo_bar_baz' | awk '
BEGIN{
  FS=OFS="="
}
{
  split($1,array,"_")
  $1=array[1] toupper(substr(array[2],1,1)) substr(array[2],2) toupper(substr(array[3],1,1)) substr(array[3],2)
}
1'
Run Code Online (Sandbox Code Playgroud)

要简单地删除_第一部分中的用法(这不会使字母大写):

echo 'foo_bar_baz=foo_bar_baz' | awk 'BEGIN{FS=OFS="="}{gsub(/_/,"",$1)} 1'
Run Code Online (Sandbox Code Playgroud)