Лучший способ генерировать случайную строку, следуя определенному шаблону в Bash
Я хочу создать много шести символьных строк, следующих этому шаблону:
[согласная] [гласная][согласная][согласная] [гласная] [согласная]
например
haplop
на GitHub
qursog
Я смотрел на различные способы сделать это, но ничего у меня нет, хотя до сих пор элегантно. Мои мысли в основном вращались вокруг создания одного персонажа за раз, но даже тогда мои идеи не были действительно все это хорошо из-за моего отсутствия знаний сценариев bash и неясных команд Linux.
В идеале я ищу команду Linux, которая случайным образом генерирует строку, но позволяет мне указать шаблон, показанный выше (если он вообще существует). В качестве альтернативы, если вы знаете простой способ сделать это в bash, это также было бы здорово.
спасибо заранее
Edit: кстати, я дам это за 24 часа до выбора принятого ответа, чтобы у меня было больше шансов выбирать лучший ответ, а не только первый (хотя первый ответ был довольно хороший).
4 ответов
вот как вы могли бы создать гласную:
s=aeiou
p=$(( $RANDOM % 5))
c=${s:$p:1}
используйте тот же метод для согласных.
вы можете обернуть это в функции:
function vowel() {
s=aeoiu
p=$(( $RANDOM % 5))
echo -n ${s:$p:1}
}
и потом, у вас есть хороший шаблон для создания строки:
s=`consonant; vowel; consonant; vowel; consonant; vowel`
#!/bin/bash
#
#
cprint () {
typ=
case $typ in
v) alpha="aeiouy" ;;
c) alpha="bcdfghjklmnpqrstvwxz" ;;
V) alpha="AEIOUY" ;;
C) alpha="BCDFGHJKLMNPQRSTVWXZ" ;;
n) alpha="0123456789" ;;
*) echo "** Undefined **" ; exit 1 ;;
esac
len=${#alpha}
r=$((RANDOM%len))
echo -en ${alpha:r:1}
}
rprint () {
code=
for i in $(seq 1 ${#code})
do
c=${code:i-1:1}
cprint $c
done
echo
}
rprint "cvccvc"
rprint "cvcvvc"
rprint "Cvccvc"
rprint "Vccvcvc"
rprint "Cvnvn"
это решение легко изменяется для печати другой последовательности, легко переопределяется, если вы не согласны с y, нужно äöü или верхний регистр и так далее.
экспериментальный результат:
gohhec
voteup
Wuwjut
Utpycoq
Va6a6
человек Баш говорит о случайном:
каждый раз, когда этот параметр ссылается, случайное целое число от 0 до 32767 ...
Итак, если взять по модулю RANDOM % X
, и X не является силой 2, нижние остатки будет больше шансов, чем один раз. Это не должно быть важно в вашем случае, если вы не идете в extereme со своими группами персонажей или не используете его в зонах повышенной безопасности. :)
для потомков я включу код, с которым я закончил. В основном он использует код Кароли хорвата, но я также добавил некоторые идеи из "неизвестного пользователя":
#!/bin/bash
function v() {
s=aeoiuy
p=$((RANDOM % ${#s}))
echo -n ${s:$p:1}
}
function c() {
s=bcdfghjklmnpqrstvwxz
p=$((RANDOM % ${#s}))
echo -n ${s:$p:1}
}
function genPatternStrings() {
for i in $(eval echo {0..}); do
echo `c;v;c;c;v;c;`
done
}
genPatternStrings ;
хотя следующая команда не отвечает на исходный вопрос, в других случаях может быть полезно создать любую случайную строку:
for i in {1..15}; do # 15 random strings
dd status=noxfer if=/dev/random bs=1 count=200 2>/dev/null |
tr -dc 'a-z0-9A-Z' | # alphanumerics only
cut -b1-10 | # length 10
tr 'A-Z' 'a-z' # lowercase
done | less