我编写了一个从字符串中随机选取4个字符的脚本,但案例是所挑选的字符不得重复。
例如我有一个字符串 abcdefgh123 该函数将从字符串中随机选择4个字符,如2bfa。
我目前的解决方案是处理数组索引,按数组长度生成随机数和模数,将其添加到堆栈,选择下一个随机数并比较堆栈(如果不是堆栈),继续直到我得到4个字符。< / p>
有没有方便的功能让我更容易做到这一点?
答案 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 " "
让我逐一解释步骤
将字符串打印到STDOUT:
echo“your_string”
将整个字符串分隔为不同的行
sed's /./& amp; \ n / g'
对它们进行随机排序,并使用uniq
命令
sort -R | uniq的
如果您的字符串被划分为中间有空格的字符串,则删除之前可能已经过去的所有空格。
sed'/ ^ $ / d'
只占用前4个字符。您可以根据要求更改号码。
head -n 4
删除尾随新行
head -c -1
连接所有行
tr'\ r \ n'''
删除字母之间的空格。
tr -d“”