37 lines
906 B
Bash
37 lines
906 B
Bash
soundex() {
|
|
local -u word=${1//[^[:alpha:]]/.}
|
|
local letter=${word:0:1}
|
|
local soundex=$letter
|
|
local previous=$letter
|
|
|
|
word=${word:1}
|
|
word=${word//[AEIOUY]/.}
|
|
word=${word//[WH]/=}
|
|
|
|
while [[ ${#soundex} -lt 4 && -n $word ]]; do
|
|
letter=${word:0:1}
|
|
|
|
if [[ $letter == "." ]]; then
|
|
previous=""
|
|
|
|
elif [[ $letter == "=" ]]; then
|
|
if [[ $previous == [A-Z] && ${word:1:1} == [A-Z] ]] &&
|
|
[[ ${value[$previous]} -eq ${value[${word:1:1}]} ]]
|
|
then
|
|
word=${word:1}
|
|
fi
|
|
|
|
elif [[ -z $previous ]] ||
|
|
[[ $letter != $previous && ${value[$letter]} -ne ${value[$previous]} ]]
|
|
then
|
|
previous=$letter
|
|
soundex+=${value[$letter]}
|
|
fi
|
|
|
|
word=${word:1}
|
|
done
|
|
# right pad with zeros
|
|
soundex+="000"
|
|
echo "${soundex:0:4}"
|
|
}
|