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?

Était-ce utile?

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[@]}'"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top