如何在sed中将python文件中的所有字符串从snake_case更改为camelCase

如何在sed中将python文件中的所有字符串从snake_case更改为camelCase

我已经从 commandlinefu 尝试了一些像这样的 sed 模式

sed -r "s/('[a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/"

但不知怎的,它不起作用。一方面,他们忘记了数字,我可以修复这一点,但这种模式仅适用于一个下划线。例如,如果我的文件中有一个字符串

'foo_bar_foo'

它将转换为

'fooBar_foo'

。这不是我想要的(我想要'fooBarFoo'

我只想更改文件中的字符串,而不是变量名称或其他任何内容。例如这个

delta_limits=Limits(general_settings['signal_lower_limit']

应该变成这样

delta_limits=Limits(general_settings['signalLowerLimit']

答案1

如果我理解正确的话,只要它出现在字符串内部,您就想更改_x为。X'...'

然后,使用 GNU sed,您可以执行以下操作:

sed -E ":1;s/^(([^']|'[^']*')*'[^']*)_([^'])/\1\u\3/;t1"

即替换一系列非引号或匹配引号后面的跟随本身_X'...

输入如下:

foo_bar 'ab_cd_ef gh_ij' zz_zz 'aa_bb''
delta_limits=Limits(general_settings['signal_lower_limit']

给出:

foo_bar 'abCdEf ghIj' zz_zz 'aaBb'
delta_limits=Limits(general_settings['signalLowerLimit']

假设您没有嵌入单引号的字符串(如'foo\'bar')。如果是这样,您需要\'通过以下方式来解释这些转义:

sed -E ":1;s/^(([^']|'([^\']|\\\\.)*')*'([^\']|\\\\.)*)_([^'])/\1\u\5/;t1"

(也占'foo\\')。

这仍然不包括"foo'bar"引号或反斜杠续行或python's '''it's a multi-line quote'''.您需要一个python解析器才能涵盖所有情况。

对于您的具体情况,

sed -E ":1;s/('\w*)_(\w)/\1\u\2/g;t1"

可能也足够了(仅替换_X后面的'\w*)。这就是 GNUsed等效项(除了\w完全匹配的内容)格伦的perl方法

答案2

我会为此使用 perl :

perl -pe "1 while s/('\w+)_([^']*)/\$1\\u\$2/" <<END
my_variable = 'a_string_with_snake_case_inside'
delta_llimits=Limits(general_settings['signal_lower_limit']
END
my_variable = 'aStringWithSnakeCaseInside'
delta_limits=Limits(general_settings['signalLowerLimit']

这意味着:当搜索和替换继续找到匹配项时,“1”(返回 true 的无操作)

相关内容