2

我有来自聊天服务器的传入消息,需要与关键字列表进行比较。我使用的是常规数组,但想切换到关联数组以尝试提高处理速度。

单词列表将在一个名为 aWords 的数组中,值将是一个“类型”指示符,即 aWords[damn]="1",其中 1 是图例中的脏话,以通知用户。

问题是我需要将每个索引值与输入 $line 进行比较以查找子字符串。如果可能的话,我试图避免通过每个索引值的循环。

http://tldp.org/LDP/abs/html/string-manipulation.html,我正在考虑 Substring Removal 部分。

${string#substring}
Deletes shortest match of $substring from front of $string.

比较 $line 中的“已删除”字符串可能会有所帮助,但它是否也匹配其他单词中间的单词?即匹配this里面的关键字his

很抱歉这篇冗长的帖子,但我试图尽我所能涵盖我试图完成的所有事情。

4

2 回答 2

1
# create a colon-separated string of the array keys
# you can do this once, after the array is created.
keys=$(IFS=:; echo "${!aWords[*]}")

if [[ ":$keys:" == *:"$word":* ]]; then
    # $word is a key in the array
    case ${aWords[$word]} in
        1) echo "Tsk tsk: $word is a swear word" ;;
        # ...
    esac
fi
于 2013-11-04T19:05:55.727 回答
0

这是我第一次听说 bash 中的关联数组。它启发了我也尝试添加一些东西,当然我完全错过了这一点。

这是一个代码片段。我希望我明白它是如何工作的:

declare -A SWEAR       #create associative array of swearwords (only once)
while read LINE
do
        [ "$LINE"] && SWEAR["$LINE"]=X
done < "/path/to/swearword/file"


while : 
do
    OUTGOING=""        #reset output "buffer"
    read REST          #read a sentence from stdin
    while "$REST"      #evaluate every word in the sentence
    do
        WORD=${REST%% *}
        REST=${REST#* }
        [ ${SWEAR[$WORD]} ] && WORD="XXXX"
        OUTGOING="$OUTGOING $WORD"
    done
    echo "$OUTGOING"    #output to stdout
done
于 2013-11-06T19:30:07.000 回答