[英]Bash string manipulation with/without whitespaces
考慮在bash中使用String來保存項目列表:
# BLUBB="item foobar blubb bar"
進一步考慮有一個排除項目清單:
# EXCLUDE="item bar blubb"
解決此問題的最簡單方法是將列表保存為不包含BLUBB的列表。 我的第一種方法是:
# for i in $EXCLUDE; do BLUBB=${BLUBB//$i/}; done
但這還從foobar
刪除了bar
。 如此看來,在$i
前后都必須尋找空白或什么也沒有。 語法如何?
可以這樣做:
#/bin/bash
BLUBB="item foobar blubb bar"
EXCLUDE="item bar blubb"
for word in ${BLUBB} ${EXCLUDE} ${EXCLUDE}; do
echo ${word}
done | sort | uniq -u
我會在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" )'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.