Wie kann ich schneiden (1) Camelcase Wörter?
-
03-07-2019 - |
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?
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[@]}'"