Переберите его вручную и заменяйте до тех пор, пока не будет ничего заменить.
sed -re '/[A-Z]+/!{ : again; /([0-9a-zA-Z])_([a-z0-9])/{ s//\1\u\2/; b again; }; }'
Я добавил A-Z
в первом регулярном выражении для обработки таких случаев, как:
this_is_a_simple -> thisIsASimple
После первого совпадения оно становится thisIsA_simple
, поэтому во втором цикле мы хотим сопоставить A_simple
.
Возможно, лучшей версией будет:
sed -re '/[A-Z]+/!{ : again; /(.*[0-9a-z])_([a-z0-9])/{ s//\1\u\2/; b again; }; }'
Поскольку регулярное выражение является жадным, это заменится с конца, поэтому this_is_a_simple
сначала становится this_is_aAimple
, затем this_isASimple
, затем thisIsASimple
.