Comment puis-je couper (1) mots camelcase?
-
03-07-2019 - |
Question
Existe-t-il un moyen simple dans Bash de scinder un mot camelcased en ses mots constitutifs?
Par exemple, je souhaite diviser un motCertainCamelCasedWord en "mot Certain Camel Cased" et pouvoir sélectionner les champs qui m'intéressent. Cela se fait trivialement avec cut (1) lorsque le séparateur de mots est le soulignement, mais comment puis-je le faire lorsque le mot est camelcased?
La solution
sed 's / \ ([A-Z] \) / \ 1 / g'
Capture chaque lettre majuscule et substitue un espace principal par la capture pour l'ensemble du flux.
$ echo "aCertainCamelCasedWord" | sed 's/\([A-Z]\)/ \1/g'
a Certain Camel Cased Word
Autres conseils
Cette solution fonctionne si vous ne devez pas séparer les mots en majuscules. Par exemple, en utilisant la réponse en haut, vous obtiendrez:
$ echo 'FAQPage' | sed 's/\([A-Z]\)/ \1/g'
F A Q Page
Mais avec ma solution, vous obtiendrez:
$ echo 'FAQPage' | sed 's/\([A-Z][^A-Z]\)/ \1/g'
FAQ Page
Remarque: cela ne fonctionne pas correctement lorsqu'il existe une deuxième instance de plusieurs mots majuscules, par exemple:
.
$ echo 'FAQPageOneReplacedByFAQPageTwo' | sed 's|\([A-Z][^A-Z]\)| \1|g'
FAQ Page One Replaced ByFAQ Page Two
Cette réponse ne fonctionne pas correctement lorsqu'il y a une seconde instance de plusieurs majuscules
echo 'FAQPageOneReplacedByFAQPageTwo' | sed 's|\([A-Z][^A-Z]\)| \1|g'
FAQ Page One Replaced ByFAQ Page Two
Donc, une expression supplémentaire est requise pour cela
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[@]}'"