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*). 이는 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를 반환하는 무작업)을 의미합니다.

관련 정보