Перестановки букв могут быть получены с помощью скобок-расширений. Пример:
$ echo {A,B}{A,B}
AA AB BA BB
Так что идея состоит в том, чтобы немного использовать это расширение. Допустим, у вас есть строка str
, тогда вы можете получить расширение скобки как:
$ str="JACK"
$ eval echo "{$(echo "$str" | fold -w1 | paste -sd,)}"
J A C K
Вы можете шаг за шагом увидеть, что это делает:
$ echo "$str" | fold -w1 | paste -sd,
J,A,C,K
fold -w1
помещает каждый символ $str$
в одну строку
paste -sd,
объединяет все строки в одну строку с запятой между ними.
Нам нужна эта комбинация, поскольку мы не можем использовать sed
. Команда eval
, в конце концов, активизирует расширение скобки.
Теперь ключ должен повторить расширение скобки n -times. Для этого мы используем printf
. Если у вас есть строка "foo"
, вы можете повторить ее n раз с printf
следующим образом:
$ printf "foo%.0s" {1..3}
foofoofoo
Итак, все перестановки с повторениями можно найти как:
$ str="JACK"
$ n=3
$ bracestring=$(printf "{$(echo "$str" | fold -w1 | paste -sd,)}%.0s" $(seq 1 $n))
$ eval echo $bracestring
JJJ JJA JJC JJK JAJ JAA JAC JAK JCJ JCA JCC JCK JKJ JKA JKC JKK AJJ AJA AJC AJK AAJ AAA AAC AAK ACJ ACA ACC ACK AKJ AKA AKC AKK CJJ CJA CJC CJK CAJ CAA CAC CAK CCJ CCA CCC CCK CKJ CKA CKC CKK KJJ KJA KJC KJK KAJ KAA KAC KAK KCJ KCA KCC KCK KKJ KKA KKC KKK