使用/不包含空格的Bash字符串操作

时间:2015-02-04 14:42:30

标签: string bash list syntax

考虑在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之前和之后寻找空格或什么都没有。这个语法怎么样?

2 个答案:

答案 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" )'