bash在关联数组中查找关键字

时间:2013-11-04 18:26:19

标签: bash associative-array

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

单词列表将在一个名为aWords的数组中,值将是一个'type'指示符,即aWords [该死的] =“1”,其中1是发誓词在一个图例中通知用户。

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

http://tldp.org/LDP/abs/html/string-manipulation.html开始,我正在考虑子串删除部分。

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

'$'中'删除'字符串的比较可能会有所帮助,但它是否会与其他单词中间的单词相匹配?即匹配 this 中的关键字他的

对于这篇冗长的帖子感到抱歉,但我试图尽我所能完成所有我想要完成的事情。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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