考虑在bash中使用String来保存项目列表:
# BLUBB="item foobar blubb bar"
进一步考虑列出项目的排除列表:
# EXCLUDE="item bar blubb"
将这个解析为持有BLUBB没有EXCLUDE的列表的最简单方法是什么。我的第一个方法是:
# for i in $EXCLUDE; do BLUBB=${BLUBB//$i/}; done
但这会从bar
中删除foobar
。所以看起来,人们必须在$i
之前和之后寻找空格或什么都没有。这个语法怎么样?
答案 0 :(得分:3)
可以这样做:
#/bin/bash
BLUBB="item foobar blubb bar"
EXCLUDE="item bar blubb"
for word in ${BLUBB} ${EXCLUDE} ${EXCLUDE}; do
echo ${word}
done | sort | uniq -u
答案 1 :(得分:1)
我在bash中使用关联数组执行此操作:
$ BLUBB="item foobar blubb bar"
$ EXCLUDE="item bar blubb"
$ declare -A h
$ for word in $BLUBB; do h[$word]=1; done
$ declare -p h
declare -A h='([blubb]="1" [bar]="1" [foobar]="1" [item]="1" )'
$ for word in $EXCLUDE; do unset "h[$word]"; done
$ declare -p h
declare -A h='([foobar]="1" )'
$ words="${!h[*]}"
$ echo "$words"
foobar
如果有任何"单词"在BLUBB或EXCLUDE中包含空格,您必须使用索引数组来保存它们:
$ BLUBB=(item foobar blubb bar "word with spaces")
$ EXCLUDE=(item bar blubb with)
$ declare -A h
$ for elem in "${BLUBB[@]}"; do h["$elem"]=1; done
$ for elem in "${EXCLUDE[@]}"; do unset "h[$elem]"; done
$ declare -p h
declare -A h='(["word with spaces"]="1" [foobar]="1" )'