Commandlinefuでこのようなsedパターンを試しました。
sed -r "s/('[a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/"
しかし、何とか動作しません。まず、それらが数字を忘れてしまったので、私は修正することができますが、このパターンは1つの下線にのみ機能します。たとえば、私のファイルに文字列がある場合
「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*
)。これはGNUと同等です(正確な一致sed
を除く)。\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を返す無作為)を意味します。