Proseguendo lungo le linee di soluzione di Borodin, ecco un bash pura uno:
let count=0
testarray=(a b c d e f g h i j k l m n o p q r s t u v w x y z)
string="> plantagenetgoosewagonattributes" # the string
pattern=">(.*)[^a]+" # regex pattern
limitvar=${#testarray[@]} #array length
[[ $string =~ $pattern ]] &&
(while [ $count -lt $limitvar ] ; do sub="${BASH_REMATCH[1]//[^${testarray[$count]}]}" ; echo "${testarray[$count]} = ${#sub}" ; ((count++)) ; done)
Fissando da bash 3.0, bash ha introdotto i gruppi di cattura ai quali è possibile accedere tramite BASH_REMATCH [n].
La soluzione dichiara i caratteri da contare come array [Partenza declare -a
per matrice declaraton nei casi complessi] .a valore del singolo carattere richiederebbe nessuna variabile di conteggio, non mentre costrutto ma una variabile per il carattere invece che una matrice.
Se si includono intervalli come nel codice precedente, questa dichiarazione di array fa esattamente la stessa cosa.
testarray=(`echo {a..z}`)
Un'introduzione di un loop if
rappresenterà la visualizzazione di 0
count caratteri. Volevo mantenere la soluzione il più semplice possibile.
Yay! Cinque upvotes per * Non puoi *. Devo provare più forte! – Borodin
È persino possibile eseguire completamente all'interno della regex. Vedi la mia risposta. – ikegami
Una risposta "AFAIK" in negativo è fondamentalmente sempre una scelta errata. Se non riesci a spiegare perché è impossibile, perché dire loro che pensi che sia? – Mark