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