Se eu entendi corretamente, você deseja alterar _x para X , contanto que ocorra dentro de '...' strings.
Então, com o GNU sed , você poderia fazer:
sed -E ":1;s/^(([^']|'[^']*')*'[^']*)_([^'])/\u/;t1"
Isso substitui um _X após '... em si seguindo uma sequência de cotações não cotadas ou correspondentes.
Que em uma entrada como:
foo_bar 'ab_cd_ef gh_ij' zz_zz 'aa_bb''
delta_limits=Limits(general_settings['signal_lower_limit']
dá:
foo_bar 'abCdEf ghIj' zz_zz 'aaBb'
delta_limits=Limits(general_settings['signalLowerLimit']
Isso pressupõe que você não tenha sequências que incorporem aspas simples (como em 'foo\'bar' ). Em caso afirmativo, você precisa contabilizar os \' escapes com:
sed -E ":1;s/^(([^']|'([^\']|\\.)*')*'([^\']|\\.)*)_([^'])/\u/;t1"
(também é responsável por 'foo\' ).
Isso ainda não cobre as citações de "foo'bar" ou as linhas continuadas com barra invertida ou python's '''it's a multi-line quote''' . Você precisaria de um python parser para poder cobrir todos os casos.
Para o seu caso particular,
sed -E ":1;s/('\w*)_(\w)/\u/g;t1"
Também pode ser suficiente (apenas substitui o _X que segue '\w* ). Esse é o equivalente em sed do GNU (exceto para o que coincide exatamente com \w ) da abordagem perl de Glenn .