Лучший способ генерировать случайную строку, следуя определенному шаблону в 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