밑줄을 PascalCase(예: UpperCamelCase)로 변환

밑줄을 PascalCase(예: UpperCamelCase)로 변환

다음과 같은 문자열이 있는 경우:

"this_is_the_string"

Bash 스크립트에서 다음과 같이 PascalCase, 즉 UpperCamelCase로 변환하고 싶습니다.

"ThisIsTheString"

lowerCamelCase로 변환하는 방법은 다음과 같습니다.

"this_is_the_string" | sed -r 's/([a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/'

불행히도 저는 정규식을 수정할 만큼 익숙하지 않습니다.

답변1

$ echo "this_is_the_string" | sed -r 's/(^|_)([a-z])/\U\2/g'            
ThisIsTheString


(^|_)문자열의 시작 부분이나 밑줄 뒤(첫 번째
([a-z])단일 소문자 세트) - 두 번째 전역
대문자 세트
\U\2(두 번째 세트) 뒤의 패턴을 바꿉니다
g.

답변2

를 사용하고 있으므로 bash문자열을 변수에 저장하면 셸에서 이 작업을 수행할 수도 있습니다.

uscore="this_is_the_string_to_be_converted"
arr=(${uscore//_/ })
printf %s "${arr[@]^}"
ThisIsTheStringToBeConverted

${uscore//_/ }_모두 공백으로 바꾸고 , (....)문자열을 배열로 분할하고, ${arr[@]^}각 요소의 첫 글자를 대문자로 변환한 다음, printf %s ..모든 요소를 ​​순서대로 인쇄합니다.
CamelCase 문자열을 다른 변수에 저장할 수 있습니다.

printf -v ccase %s "${arr[@]^}"

나중에 다음과 같이 사용/재사용하세요.

printf %s\\n $ccase
ThisIsTheStringToBeConverted

또는 다음을 사용하여 zsh:

uscore="this_is_the_string_to_be_converted"
arr=(${(s:_:)uscore})
printf %s "${(C)arr}"
ThisIsTheStringToBeConverted

(${(s:_:)uscore})문자열을 _배열로 분할하고 (C)각 요소의 첫 글자를 대문자로 만든 다음 printf %s ...모든 요소를 ​​순서대로 인쇄합니다.
다른 변수에 저장하려면 (j::)조인 요소를 사용할 수 있습니다.

ccase=${(j::)${(C)arr}}

나중에 사용/재사용하세요.

printf %s\\n $ccase
ThisIsTheStringToBeConverted

답변3

이것이 Perl 방식입니다:

$ echo "this_is_the_string" | perl -pe 's/(^|_)./uc($&)/ge;s/_//g'
ThisIsTheString

임의 길이의 문자열을 처리할 수 있습니다.

$ echo "here_is_another_larger_string_with_more_parts" | 
    perl -pe 's/(^|_)./uc($&)/ge;s/_//g'
HereIsAnotherLargerStringWithMoreParts

.문자열 시작 부분이나 (^|_)밑줄( ) 뒤의 모든 문자( ) 와 일치 하고 이를 대문자 버전( uc($&))으로 바꿉니다. 이것은 $&방금 일치된 항목을 포함하는 특수 변수입니다. 끝에 있는 것은 e교체에 표현식(이 경우 함수)을 사용할 수 있도록 s///ge하고 교체되도록 합니다.uc()g모두라인에서 발생합니다. 두 번째 대체는 밑줄을 제거합니다.

답변4

대표할 필요 없어모두정규식 일치의 문자열 - sed에는 /g여러 일치 항목을 반복하고 각각을 바꿀 수 있는 수정자가 있습니다.

echo "this_is_the_string" | sed 's/_\([a-z]\)/\U\1/g;s/^\([a-z]\)/\U\1/g'

첫 번째 정규식은 _\([a-z]\)밑줄 뒤의 각 문자입니다. 두 번째 정규식은 문자열의 첫 번째 문자와 일치합니다.

관련 정보