例如,我有字符串:
explicit_borders="\"\"''()"
如何根据该字符串计算出具有以下结果的字符串:
distinct_border_chars="\"'()" # contains only unique set of chars
为了解决这个问题,我是否应该循环遍历字符串中的每个字符,并仅在结果字符串不包含该字符时才添加该字符?或者也许有一些更简单的 bash 特定解决方案?
(很奇怪,这么简单的问题我在SE网站上找不到相关问题。可能搜索查询应该包含一些其他关键词?)
是的,它可以在纯 bash 中完成,我们需要的只是一个关联数组来充当哈希映射,并在输入字符串中出现的每个字符上键入键。如果该字符出现过一次,则将其附加到最终结果
#!/usr/bin/env bash
explicit_borders="\"\"''()"
declare -A seen
result=""
for (( i=0; i<${#explicit_borders}; i++ )); do
c="${explicit_borders:$i:1}"
if ! [[ -n "${seen[$c]}" ]]; then
seen[$c]=1
result+="$c"
fi
done
printf -v result '%q' "$result"
printf "%s\n" "${result}"
末尾的
%q
格式说明符使 printf 以可重复用作 shell 输入的格式输出相应的参数。
你可以定义这个函数
unique_chars() {
head=
tail=$1
while test "$tail"; do
next=${tail#?}
char=${tail%"$next"}
case $head in
*"$char"*) ;;
*) head=$head$char
esac
tail=$next
done
printf '%s\n' "$head"
}
并像这样使用它
$ explicit_borders="\"\"''()"
$ unique_chars "$explicit_borders"
"'()