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)
如果我理解正确的话,你要改变_x
到X
,只要它里面出现'...'
的字符串。
然后,使用 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