如何从字符串

时间:2017-02-02 10:51:16

标签: bash shell

我编写了一个从字符串中随机选取4个字符的脚本,但案例是所挑选的字符不得重复。

例如我有一个字符串 abcdefgh123 该函数将从字符串中随机选择4个字符,如2bfa。

我目前的解决方案是处理数组索引,按数组长度生成随机数和模数,将其添加到堆栈,选择下一个随机数并比较堆栈(如果不是堆栈),继续直到我得到4个字符。< / p>

有没有方便的功能让我更容易做到这一点?

2 个答案:

答案 0 :(得分:1)

这仅适用于内置的Bash功能,不需要其他二进制文件。

pick_unique() {
    declare -r S=${1:?}
    declare -ir N=${2:-4}
    declare s o
    declare -i i j
    for ((i = 0; i < ${#S}; i++)); do
        [[ $s = *${S:i:1}* ]] || s+=${S:i:1}
    done
    ((${#s}>=N)) || return 1
    for ((i = 0; i < N; i++)); do
        j=$((RANDOM % ${#s}))
        o+=${s:j:1} s=${s:0:j}${s:j+1}
    done
    printf '%s\n' "$o"
}
pick_unique 'your_string'

答案 1 :(得分:0)

echo "your_string" | sed 's/./&\n/g' | sort -R | uniq | sed '/^$/d' | head -n 4 | head -c -1 | tr '\r\n' ' ' | tr -d " "

让我逐一解释步骤

  1. 将字符串打印到STDOUT:

    echo“your_string”

  2. 将整个字符串分隔为不同的行

    sed's /./& amp; \ n / g'

  3. 对它们进行随机排序,并使用uniq命令

    获取唯一值

    sort -R | uniq的

  4. 如果您的字符串被划分为中间有空格的字符串,则删除之前可能已经过去的所有空格。

    sed'/ ^ $ / d'

  5. 只占用前4个字符。您可以根据要求更改号码。

    head -n 4

  6. 删除尾随新行

    head -c -1

  7. 连接所有行

    tr'\ r \ n'''

  8. 删除字母之间的空格。

    tr -d“”