如何从 bash 脚本中的现有字符串中获取具有明确(唯一)字符的字符串?

问题描述 投票:0回答:2

例如,我有字符串:

explicit_borders="\"\"''()"

如何根据该字符串计算出具有以下结果的字符串:

distinct_border_chars="\"'()"  # contains only unique set of chars

为了解决这个问题,我是否应该循环遍历字符串中的每个字符,并仅在结果字符串不包含该字符时才添加该字符?或者也许有一些更简单的 bash 特定解决方案?

(很奇怪,这么简单的问题我在SE网站上找不到相关问题。可能搜索查询应该包含一些其他关键词?)

string bash shell distinct-values
2个回答
0
投票

是的,它可以在纯 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 输入的格式输出相应的参数。


0
投票

你可以定义这个函数

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"
"'()
© www.soinside.com 2019 - 2024. All rights reserved.