Frage

Gibt es eine einfache Möglichkeit, in Bash ein camelcase Wort in seine Bestandteile zur Trennung von Worten?

Zum Beispiel möchte ich aCertainCamelCasedWord in ‚a Certain Kamel MANTEL Wort‘ und in der Lage, diese Felder aufteilen auszuwählen, die mich interessieren. Dies ist trivialerweise mit Schnitt gemacht (1), wenn das Worttrenn ist der Unterstrich, aber wie kann ich dies tun, wenn das Wort camelcase ist?

War es hilfreich?

Lösung

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

Erfaßt jeden Großbuchstaben und ersetzt einen führenden Platz bei der Erfassung für den gesamten Strom.

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

Andere Tipps

Diese Lösung funktioniert, wenn Sie ohne Worte aufzuteilen, dass alle Kappen sind. Um zum Beispiel der Top-Antwort mit Sie erhalten:

$ echo 'FAQPage' | sed 's/\([A-Z]\)/ \1/g' 
F A Q Page

Aber anstatt mit meiner Lösung, die Sie erhalten:

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

Hinweis: Dies funktioniert nicht richtig, wenn eine zweite Instanz mehrerer Worte in Großbuchstaben ist, zum Beispiel:

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

Diese Antwort nicht richtig funktioniert, wenn es eine zweite Instanz von mehreren Groß

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

So und zusätzlicher Ausdruck dafür erforderlich

 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

Reine 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[@]}'"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top