我已经从 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 的无操作)