Domanda

Esiste un modo semplice in Bash di dividere una parola camelcata nelle sue parole costitutive?

Ad esempio, desidero dividere aCertainCamelCasedWord in "una determinata parola incastonata di cammelli" ed essere in grado di selezionare quei campi che mi interessano. Questo è banalmente fatto con cut (1) quando il separatore di parole è il trattino basso, ma come posso farlo quando la parola viene camelcasata?

È stato utile?

Soluzione

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

Cattura ogni lettera maiuscola e sostituisce uno spazio iniziale con l'acquisizione per l'intero flusso.

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

Altri suggerimenti

Questa soluzione funziona se non devi dividere le parole che sono tutte maiuscole. Ad esempio, usando la risposta migliore otterrai:

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

Ma invece con la mia soluzione, otterrai:

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

Nota: questo non funziona correttamente quando esiste una seconda istanza di più parole maiuscole, ad esempio:

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

Questa risposta non funziona correttamente quando è presente una seconda istanza di maiuscole multiple

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

Quindi è necessaria un'espressione aggiuntiva per questo

 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[@]}'"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top