Отримайте всі можливі комбінації слова малими та малими літерами


14

Я хочу написати скрипт bash для друку всіх можливих перестановок нижнього та верхнього регістру певного слова, наприклад, harley:

harley
harleY
harlEy
harLey
...
HARLey
HARLEy
HARLEY

Моє наївне рішення - написати n-го (n є len (слово)) вкладене для-циклу для цього конкретного слова:

#!/bin/bash
for a in {h,H}; do
    for b in {a,A}; do
    ...
    done
done

Однак мені доведеться знову кодувати сценарій для іншого слова.

Чи є кращий спосіб досягти цього?

Відповіді:


18

Трохи краще рішення:

echo {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}

Для повної масштабованості:

echo harley \
| perl -nle 'print "echo ",
                    join "",map { "{" . lc . "," .uc ."}" } split //' \
| xargs -I {} bash -c "{}"

Якщо ви абсолютно повинні мати одне слово на рядок, перейдіть з

for w in {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y};do echo $w;done

завдяки коментарю mattdm

Відповідна масштабована версія буде:

echo harley \
| perl -nle 'print join "",map { "{" . lc . "," .uc ."}" } split //' \
| xargs -I {} bash -c 'for w in {};do echo $w;done'

Для задоволення спробуйте замінити "harley" на "supercalifragilisticexpialidocious" Минуло 5 хвилин, і мій комп'ютер все ще хрумтить на цьому і, ймовірно, ніколи не закінчиться :)


1
для w в {h, H} {a, A} {r, R} {l, L} {e, E} {y, Y}; do echo $ w; done
mattdm

4
Ще простіше рішення на одну лінію:printf '%s\n' {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}
John1024

2
@ John1024 Я закликаю вас опублікувати це як відповідь, це недооцінена особливість bash'sprintf
steeldriver

10
eval echo $ (ехо " слово " | sed 's /./ {\ U &, \ L &} / g')
  • sed 's/./{&,&}/g'перетвориться Fooна {F,F}{o,o}{o,o}, що було б досить марно. Але додайте \Uі, \Lі ви отримаєте верхній і нижній регістр кожної літери; тобто {F,f}{O,o}{O,o}.
  • Тоді це простий предмет використання, evalщоб сказати оболонці для розширення послідовностей дужок { X , x }.

1
Гарний трюк :). Якби я міг прийняти дві відповіді, і твою прийняли б! Оновлення все одно
полим

5

EDIT 2: Ця відповідь неправильна. Він не створює 2 ^ n комбінацій, як слід.

EDIT: Я не знаю чому, але це рішення справді швидко порівняно з рішенням perl від @Joeseph R. Він запускає "Supercalifragilisticexpialidocious" менш ніж за 0,3 секунди!

Ось моя тріщина в цьому:

#!/bin/bash

str=${1^^}  # convert to uppercase
len=${#str} # get length of string

for ((perm=0; perm <= len; perm++)); do
    for ((i=0; i <= len; i++)); do
        lower=${str,,}   # convert to lowercase

        # Uppercase n-th letter for permutation
        if [ $perm -gt 0 ]; then
            nth=${lower:perm-1}
            lower=$(echo ${lower:0:perm-1}${nth^})
        fi

        echo -n ${str:0:i} # print orig string from 0 to $i
        echo ${lower:i}    # print new string from $i to end
    done
done | sort -u

Запуск:

$ ./permutations.sh hi
hi
hI
Hi
HI

$ ./permutations.sh harley
harley
harleY
harlEy
harLey
haRley
hArley
Harley
HarleY
HarlEy
HarLey
HaRley
HArley
HArleY
HArlEy
HArLey
HARley
HARleY
HARlEy
HARLey
HARLeY
HARLEy
HARLEY

Не соромтеся роздвоювати та змінювати, я впевнений, що це можна оптимізувати. https://gist.github.com/ryanmjacobs/4c02ad80f833dee0c307


1
Код явно не друкує всіх результатів. Якщо у harleyвас повинно бути 64 результати, де harLEY, наприклад?
Денис

1
@Denis Yup ти маєш рацію. Кожен раз, коли має бути 2 ^ n результатів, де n - кількість символів вихідного рядка. Ця відповідь неправильна.
ryanmjacobs

0

Якщо ви віддаєте перевагу використовувати готові інструменти замість кодування, ви можете використовувати TextMechanic (інструмент генератора перестановки / комбінування) та Unit-Conversion.info


Як вони могли б отримати та використовувати саме ці інструменти?
Джефф Шаллер

Цю відповідь можна значно покращити, додавши кілька деталей, таких як домашні сторінки або сховища GitHub для цих проектів та / або якщо вони можуть бути встановлені з пакету.
Ентоні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.