Come posso tagliare (1) parole di camelcase?
-
03-07-2019 - |
Domanda
Esiste un modo semplice in Bash di dividere una parola camelcata nelle sue parole costitutive?
Ad esempio, desidero dividere aCertainCamelCasedWord in "una determinata parola incastonata di cammelli" ed essere in grado di selezionare quei campi che mi interessano. Questo è banalmente fatto con cut (1) quando il separatore di parole è il trattino basso, ma come posso farlo quando la parola viene camelcasata?
Soluzione
sed 's / \ ([A-Z] \) / \ 1 / g'
Cattura ogni lettera maiuscola e sostituisce uno spazio iniziale con l'acquisizione per l'intero flusso.
$ echo "aCertainCamelCasedWord" | sed 's/\([A-Z]\)/ \1/g'
a Certain Camel Cased Word
Altri suggerimenti
Questa soluzione funziona se non devi dividere le parole che sono tutte maiuscole. Ad esempio, usando la risposta migliore otterrai:
$ echo 'FAQPage' | sed 's/\([A-Z]\)/ \1/g'
F A Q Page
Ma invece con la mia soluzione, otterrai:
$ echo 'FAQPage' | sed 's/\([A-Z][^A-Z]\)/ \1/g'
FAQ Page
Nota: questo non funziona correttamente quando esiste una seconda istanza di più parole maiuscole, ad esempio:
$ echo 'FAQPageOneReplacedByFAQPageTwo' | sed 's|\([A-Z][^A-Z]\)| \1|g'
FAQ Page One Replaced ByFAQ Page Two
Questa risposta non funziona correttamente quando è presente una seconda istanza di maiuscole multiple
echo 'FAQPageOneReplacedByFAQPageTwo' | sed 's|\([A-Z][^A-Z]\)| \1|g'
FAQ Page One Replaced ByFAQ Page Two
Quindi è necessaria un'espressione aggiuntiva per questo
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
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[@]}'"