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

use*_*095 6 sed text-processing regular-expression

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

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

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

'foo_bar_foo'

它将转换为

'fooBar_foo'

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

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

delta_limits=Limits(general_settings['signal_lower_limit']
Run Code Online (Sandbox Code Playgroud)

应该变成这个

delta_limits=Limits(general_settings['signalLowerLimit']
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 6

如果我理解正确的话,你要改变_xX,只要它里面出现'...'的字符串。

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

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

即在非引号或匹配引号序列之后替换_X跟随'...本身。

哪个输入像:

foo_bar 'ab_cd_ef gh_ij' zz_zz 'aa_bb''
delta_limits=Limits(general_settings['signal_lower_limit']
Run Code Online (Sandbox Code Playgroud)

给出:

foo_bar 'abCdEf ghIj' zz_zz 'aaBb'
delta_limits=Limits(general_settings['signalLowerLimit']
Run Code Online (Sandbox Code Playgroud)

假设您没有嵌入单引号的字符串(如'foo\'bar')。如果是这样,您需要考虑这些\'转义:

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

(也占'foo\\')。

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

对于您的特定情况,

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

也可能是足够的(只替换_X下面'\w*)。这是Glenn方法的 GNUsed等价物(除了\w完全匹配的)。perl