Pergunta

Existe uma maneira fácil em Bash para dividir uma palavra CamelCased em suas palavras constituintes?

Por exemplo, eu quero dividir aCertainCamelCasedWord em 'uma certa Camel Cased Palavra' e ser capaz de selecionar os campos que me interessam. Esta é trivialmente feito com corte (1), quando a palavra separador é o sublinhado, mas como posso fazer isso quando a palavra é CamelCased?

Foi útil?

Solução

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

Captura cada letra maiúscula e substitui um espaço à esquerda com a captura de todo o fluxo.

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

Outras dicas

Esta solução funciona se você precisa para não dividir as palavras que são todos os tampões. Por exemplo, usando a resposta de topo você vai ter:

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

Mas, em vez com a minha solução, você vai ter:

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

Nota: Isso não funciona correctamente se houver uma segunda instância de várias palavras em maiúsculas, por exemplo:

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

Esta resposta não funciona correctamente se houver uma segunda instância de múltipla maiúsculas

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

Assim, e de expressão adicional é necessário para que

 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[@]}'"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top