밑줄을 PascalCase, 즉 UpperCamelCase로 변환 같이 표시하려고합니다. “ThisIsTheString” lowerCamelCase로 변환하는 방법은

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

"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/'

불행히도 나는 이것을 수정하기 위해 정규 표현식에 익숙하지 않습니다.



답변

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

(^|_)문자열의 시작 부분 또는 밑줄 (첫 번째 그룹
([a-z])단일 소문자-두 번째 그룹)

\U\2두 번째 그룹을
g전체적으로 대문자로 대체 하여 대체 패턴 .


답변

을 사용하고 있으므로 bash문자열을 변수에 저장하면 쉘 전용으로 수행 할 수도 있습니다.

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

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

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

답변

펄 방식은 다음과 같습니다.

$ 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그것을 대체하게 모든 라인에서 발생합니다. 두 번째 대체는 밑줄을 제거합니다.


답변

정규 표현식 일치로 전체 문자열 을 나타낼 필요는 없습니다. sed에는 /g여러 일치 항목을 살펴보고 각각을 바꿀 수 있는 수정자가 있습니다.

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

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


답변

나는 지금까지 다른 어떤 것보다 더 짧고 단순하기 때문에이 답변을 넣었습니다.

sed -re "s~(^|_)(.)~\U\2~g"

대문자 _, 시작 또는 뒤에 오는 문자 . 문자가없는 문자는 변경되지 않습니다.


답변

펄에서 :

$ echo 'alert_beer_core_hemp' | perl -pe 's/(?:\b|_)(\p{Ll})/\u$1/g'
AlertBeerCoreHemp

이것은 또한 i18n 가능합니다 :

$ echo 'алерт_беер_коре_хемп' | perl -CIO -pe 's/(?:\b|_)(\p{Ll})/\u$1/g'
АлертБеерКореХемп

답변

나는 이렇게했다 :

echo "this_is_the_string" | sed -r 's/(\<|_)([[:alnum:]])/\U\2/g'

이 결과를 얻었습니다.

ThisIsTheString