2009-03-05 17 views
8

Czy w Bash jest łatwy sposób na podzielenie słowa z wielbłądami na jego słowa składowe?Jak wycinać (1) słowa z camelcase?

Na przykład, chcę podzielić aCertainCamelCasedWord na "Certain Camel Cased Word" i być w stanie wybrać te pola, które mnie interesują. Jest to robione trywialnie przez wycięcie (1), gdy separatorem słów jest podkreślenie, ale jak mogę to zrobić, gdy słowo jest wielowyrazowe?

Odpowiedz

27

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

Przechwytuje każdą literę i zastępuje wiodącą przestrzeń do chwytania dla całego strumienia.

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

kocham wyrażeń regularnych. – cwallenpoole

0

Czysta Bash:

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[@]}'" 
+0

Interesujące, ale o wiele bardziej szczegółowe. Użyj odpowiedniego narzędzia do pracy, o której mówię! ;) –

2

Musiałem nie rozdzielić wszystkie czapki:

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

This answer nie działa prawidłowo, gdy znajduje się druga instancja stwardnienie wielkimi literami

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

Więc i dodatkowa ekspresja jest wymagane dla tego

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