문제

Bash가 낙타 표적 단어를 구성 단어로 나누는 쉬운 방법이 있습니까?

예를 들어, AcezeterCamelcasedword를 '특정 낙타 케이스 워드'로 나누고 관심있는 필드를 선택할 수 있기를 원합니다. 이것은 분리기라는 단어가 밑줄 일 때 컷 (1)으로 사소하게 이루어 지지만 단어가 낙타 할 때 어떻게해야합니까?

도움이 되었습니까?

해결책

sed 's/\([A-Z]\)/ \1/g'

각 대문자를 캡처하고 전체 스트림을위한 캡처와 선행 공간을 대체합니다.

$ echo "aCertainCamelCasedWord" | sed 's/\([A-Z]\)/ \1/g'
a Certain Camel Cased Word

다른 팁

이 솔루션은 모든 캡 인 단어를 분할하지 않아도됩니다. 예를 들어, 최고 답변을 사용하면 다음과 같이받을 수 있습니다.

$ echo 'FAQPage' | sed 's/\([A-Z]\)/ \1/g' 
F A Q Page

그러나 대신 내 솔루션을 사용하면 다음을 얻을 수 있습니다.

$ echo 'FAQPage' | sed 's/\([A-Z][^A-Z]\)/ \1/g'
FAQ Page

참고 : 예를 들어 여러 대문자 단어의 두 번째 인스턴스가있는 경우 올바르게 작동하지 않습니다.

$ echo 'FAQPageOneReplacedByFAQPageTwo' | sed 's|\([A-Z][^A-Z]\)| \1|g'
FAQ Page One Replaced ByFAQ Page Two

이 답변 여러 대문자의 두 번째 인스턴스가있을 때 올바르게 작동하지 않습니다.

echo 'FAQPageOneReplacedByFAQPageTwo' | sed 's|\([A-Z][^A-Z]\)| \1|g'
FAQ Page One Replaced ByFAQ Page Two

따라서 추가 표현이 필요합니다

 echo 'FAQPageOneReplacedByFAQPageTwo' | sed -e 's|\([A-Z][^A-Z]\)| \1|g' -e 's|\([a-z]\)\([A-Z]\)|\1 \2|g'
 FAQ Page One Replaced By FAQ Page Two

순수한 배쉬 :

name="aCertainCamelCasedWord"

declare -a word                                 # the word array

counter1=0                                      # count characters
counter2=0                                      # count words

while [ $counter1 -lt ${#name} ] ; do
  nextchar=${name:${counter1}:1}
  if [[ $nextchar =~ [[:upper:]] ]] ; then
    ((counter2++))
    word[${counter2}]=$nextchar
  else
    word[${counter2}]=${word[${counter2}]}$nextchar
  fi
  ((counter1++))
done

echo -e "'${word[@]}'"
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top