2009-03-05 1 views
8

C'è un modo semplice in Bash per dividere una parola camelcas nelle sue parole costitutive?Come posso tagliare (1) parole di una catena?

Ad esempio, voglio dividere unCertainCamelCasedWord in "un certo Word Casel Camel" ed essere in grado di selezionare i campi che mi interessano. Questo è banalmente fatto con cut (1) quando il separatore di parole è il carattere di sottolineatura, ma come posso farlo quando la parola è camelcased?

risposta

27

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

Cattura ogni lettera maiuscola e sostituisce uno spazio iniziale con la cattura per l'intero flusso.

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

amo le espressioni regolari. – cwallenpoole

0

Pure 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

Interessante, ma molto più dettagliato. Usa lo strumento giusto per il lavoro che dico! ;) –

2

avevo bisogno di non dividere tutto in maiuscolo:

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

This answer non funziona correttamente quando v'è una seconda istanza di maiuscole multipla

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

espressione Quindi e supplementare è richiesto per tale

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