Đi dọc theo dòng của giải pháp Borodin của, đây là một bash tinh khiết một:
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)
Nhìn từ bash 3.0, bash đã giới thiệu các nhóm chụp có thể được truy cập thông qua BASH_REMATCH [n].
Giải pháp tuyên bố các ký tự được tính là mảng [Kiểm tra declare -a
cho khai báo mảng trong trường hợp phức tạp] .Một số ký tự đơn sẽ không yêu cầu biến số, không trong khi xây dựng nhưng biến cho ký tự thay vì mảng.
Nếu bạn bao gồm các phạm vi như trong đoạn mã trên, khai báo mảng này thực hiện điều chính xác.
testarray=(`echo {a..z}`)
Giới thiệu của một vòng lặp if
sẽ chiếm hiển thị các ký tự 0
đếm. Tôi muốn giữ cho giải pháp càng đơn giản càng tốt.
Yay! Năm upvotes cho * Bạn không thể *. Tôi phải cố gắng hơn nữa! – Borodin
Nó thậm chí có thể làm hoàn toàn trong regex. Xem câu trả lời của tôi. – ikegami
Câu trả lời "AFAIK" trong tiêu cực về cơ bản luôn là lựa chọn đăng bài không tốt. Nếu bạn không thể giải thích tại sao nó là không thể, tại sao nói với họ bạn nghĩ rằng nó là? – Mark