Pregunta

¿Hay una manera fácil en Bash de dividir una palabra en camello en sus palabras constitutivas?

Por ejemplo, quiero dividir una palabraCertainCamelCasedWord en 'cierta palabra en camello' y poder seleccionar los campos que me interesan. Esto se hace trivialmente con cut (1) cuando el separador de palabras es el guión bajo, pero ¿cómo puedo hacer esto cuando la palabra aparece en camello?

¿Fue útil?

Solución

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

Captura cada letra mayúscula y sustituye un espacio inicial con la captura de todo el flujo.

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

Otros consejos

Esta solución funciona si no necesita dividir las palabras con mayúsculas. Por ejemplo, utilizando la respuesta superior obtendrá:

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

Pero en lugar de eso, con mi solución, obtendrás:

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

Nota: Esto no funciona correctamente cuando hay una segunda instancia de varias palabras en mayúscula, por ejemplo:

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

Esta respuesta no funciona correctamente cuando hay una segunda instancia de mayúsculas múltiples

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

Entonces, se requiere una expresión adicional para eso

 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top