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 .