¿Cómo puedo cortar (1) palabras de camello?
-
03-07-2019 - |
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?
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[@]}'"