Лучший способ создать случайную строку по определенному шаблону в Bash - PullRequest
7 голосов
/ 12 августа 2011

Я хочу сгенерировать много строк из шести символов, следующих за этим шаблоном:

[согласный] [гласные] [согласный] [согласный] [гласные] [согласный]

, например

haplop
GitHub
qursog

Я рассмотрел различные способы сделать это, но ничего из того, что у меня есть, пока не изящно. Мои мысли в основном вращались вокруг создания одного персонажа за раз, но даже тогда мои идеи были не слишком хороши из-за недостатка знаний сценариев bash и неясных команд Linux.

В идеале я ищу команду Linux, которая случайным образом генерирует строку, но позволяет мне указать шаблон, показанный выше (если он вообще существует). В качестве альтернативы, если вы знаете простой способ сделать это в bash, это также было бы здорово.

Заранее спасибо

Редактировать: Кстати, я дам это за 24 часа до выбора принятого ответа, чтобы у меня было больше шансов выбрать лучший ответ, а не только первый (хотя первый ответ был довольно хорошим).

Ответы [ 4 ]

14 голосов
/ 12 августа 2011

Вот как вы можете сгенерировать гласный:

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`
2 голосов
/ 12 августа 2011

#!/bin/bash
#
#
cprint () {
    typ=$1
    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=$1
    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, нужно äöü или UPPERCASE и т. Д.

Экспериментальный результат:

gohhec
voteup
Wuwjut
Utpycoq
Va6a6

man bash говорит о СЛУЧАЙНОМ:

Каждый раз, когда на этот параметр ссылаются, случайное целое число от 0 до 32767 ...

Таким образом, если взять по модулю RANDOM % X, а X не является степенью 2, у нижних остатков будет больше шансов, чем у одного.Это не должно быть важно в вашем случае, если вы не выходите за пределы своей группы персонажей или не используете ее в зонах повышенной безопасности.:)

1 голос
/ 29 июня 2013

Хотя следующая команда не отвечает на исходный вопрос, в других случаях может быть полезно сгенерировать любую случайную строку:

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
1 голос
/ 12 августа 2011

Для потомков я включу код, которым я закончил.В основном он использует код Кароли Хорват, но я также добавил несколько идей из «неизвестного пользователя»:

#!/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..$1}); do
        echo `c;v;c;c;v;c;`
    done
}

genPatternStrings $1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...