Holen Sie sich alle möglichen Kombinationen eines Wortes in Klein- / Großbuchstaben

14

Ich möchte ein Bash-Skript schreiben, um alle möglichen Klein- und Großbuchstaben eines bestimmten Wortes zu drucken, zB harley:

harley
harleY
harlEy
harLey
...
HARLey
HARLEy
HARLEY

Meine naive Lösung besteht darin, eine n-te (n ist len ​​(word)) verschachtelte for-Schleife für dieses spezielle Wort zu schreiben:

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

Allerdings müsste ich das Skript erneut für ein anderes Wort codieren.

Gibt es einen besseren Weg, um dies zu erreichen?

Polym
quelle

Antworten:

18

Eine etwas bessere Lösung:

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

Für volle Skalierbarkeit:

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

Wenn Sie unbedingt ein Wort pro Zeile haben müssen, gehen Sie mit

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

dank des Kommentars von mattdm

Die entsprechende skalierbare Version wäre:

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

Versuchen Sie zum Spaß, "harley" durch "supercalifragilisticexpialidocious" zu ersetzen. Es sind 5 Minuten vergangen und mein Computer knirscht immer noch mit diesem und wird wahrscheinlich nie fertig :)

Joseph R.
quelle
1
für w in {h, H} {a, A} {r, R} {l, L} {e, E} {y, Y}; do echo $ w; done
mattdm
4
Eine noch einfachere Ein-pro-Zeile-Lösung:printf '%s\n' {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}
John1024
2
@ John1024 Ich ermutige Sie, dies als Antwort zu posten. Dies ist eine printf
unterbewertete
10
eval echo $ (echo " word " | sed 's /./ {\ U &, \ L &} / g')
  • sed 's/./{&,&}/g'würde sich Fooin {F,F}{o,o}{o,o}, was ziemlich sinnlos wäre. Aber füge hinzu \Uund \Lund du erhältst die Groß- und Kleinschreibung jedes Buchstabens; dh {F,f}{O,o}{O,o}.
  • Dann ist es eine einfache Sache eval, der Shell mitzuteilen, dass sie die { X , x } -Klammersequenzen erweitern soll.
Scott
quelle
1
Guter Trick :). Wenn ich zwei Antworten annehmen könnte, würde auch Ihre angenommen! Trotzdem
positiv
5

EDIT 2: Diese Antwort ist falsch. Es werden nicht wie erwartet 2 ^ n Kombinationen erzeugt.

EDIT: Ich weiß nicht warum, aber diese Lösung ist wirklich schnell im Vergleich zu der Perl-Lösung von @Joeseph R. Es läuft "Supercalifragilisticexpialidocious" in weniger als 0,3 Sekunden!

Hier ist mein Knaller:

#!/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

Laufen es:

$ ./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

Fühlen Sie sich frei, es zu gabeln und zu modifizieren, ich bin sicher, dass es optimiert werden kann. https://gist.github.com/ryanmjacobs/4c02ad80f833dee0c307

ryanmjacobs
quelle
1
Der Code gibt eindeutig nicht alle Ergebnisse aus. Mit harley64 Ergebnissen solltest du, wo ist harLEYzum Beispiel?
Denis
1
@ Jenis Yup du hast recht. Jedes Mal sollten 2 ^ n Ergebnisse vorliegen, wobei n die Anzahl der Zeichen der ursprünglichen Zeichenfolge ist. Diese Antwort ist falsch.
Ryanmjacobs
0

Wenn Sie fertige Tools anstelle von Codierung verwenden möchten, können Sie TextMechanic (Permutations- / Kombinationsgenerator-Tool) und Unit-Conversion.info verwenden

Gemischt
quelle
Wie würden sie genau diese Werkzeuge bekommen und benutzen?
Jeff Schaller
Diese Antwort könnte erheblich verbessert werden, indem einige Details hinzugefügt werden, z. B. die Startseiten oder GitHub-Repositorys für diese Projekte und / oder wenn sie aus einem Paket installiert werden können.
Anthony G - Gerechtigkeit für Monica