Ottieni tutte le possibili combinazioni di una parola in lettere minuscole / maiuscole


14

Voglio scrivere uno script bash per stampare tutte le possibili permutazioni minuscole e maiuscole di una determinata parola, ad esempio harley:

harley
harleY
harlEy
harLey
...
HARLey
HARLEy
HARLEY

La mia ingenua soluzione è scrivere un n-th (n is len (word)) annidato for-loop per questa parola specifica:

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

Tuttavia, dovrei codificare nuovamente lo script per una parola diversa.

C'è un modo migliore per raggiungere questo obiettivo?

Risposte:


18

Una soluzione leggermente migliore:

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

Per la piena scalabilità:

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

Se devi assolutamente avere una parola per riga, vai con

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

grazie al commento di mattdm

La versione scalabile corrispondente sarebbe:

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

Per divertimento, prova a sostituire "harley" con "supercalifragilisticexpialidocious" Sono passati 5 minuti e il mio computer si sta ancora sgranocchiando su questo e probabilmente non finirà mai :)


1
per w in {h, H} {a, A} {r, R} {l, L} {e, E} {y, Y}; do eco $ w; fatto
mattdm

4
Una soluzione one-per-line ancora più semplice:printf '%s\n' {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}
Giovanni 1024

2
@ John1024 Ti incoraggio a postarlo come risposta, è una caratteristica printf
sottovalutata

10
eval echo $ (echo " parola " | sed 's /./ {\ U &, \ L &} / g')
  • sed 's/./{&,&}/g'si trasformerebbe Fooin {F,F}{o,o}{o,o}, il che sarebbe piuttosto inutile. Ma aggiungi \Ue \Le otterrai le lettere maiuscole e minuscole di ogni lettera; Per esempio, {F,f}{O,o}{O,o}.
  • Quindi si tratta semplicemente di usare evalper dire alla shell di espandere le sequenze di parentesi graffe { X , x }.

1
Bel trucco :). Se potessi accettare due risposte, anche la tua verrebbe accettata! Votazione comunque
polimero

5

EDIT 2: questa risposta è sbagliata. Non produce 2 ^ n combinazioni come dovrebbe.

EDIT: Non so perché, ma questa soluzione è davvero veloce rispetto alla soluzione perl di @Joeseph R. Esegue "Supercalifragilisticexpialidocious" in meno di 0,3 secondi!

Ecco il mio crack:

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

Eseguendolo:

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

Sentiti libero di fork e modificarlo, sono sicuro che può essere ottimizzato. https://gist.github.com/ryanmjacobs/4c02ad80f833dee0c307


1
Il codice chiaramente non stampa tutti i risultati. Con harleyte dovresti avere 64 risultati, dov'è harLEY, per esempio?
Denis,

1
@Denis Yup hai ragione. Ogni volta dovrebbero esserci 2 ^ n risultati, dove n è il numero di caratteri della stringa originale. Questa risposta è sbagliata
ryanmjacobs,

0

Se si preferisce utilizzare gli strumenti pronti anziché la codifica, è possibile utilizzare TextMechanic (strumento generatore di permutazione / combinazione) e Unit-Conversion.info


Come avrebbero ottenuto e utilizzato quegli strumenti, esattamente?
Jeff Schaller

Questa risposta potrebbe essere notevolmente migliorata aggiungendo alcuni dettagli come le home page o i repository GitHub per questi progetti e / o se possono essere installati da un pacchetto.
Anthony G - giustizia per Monica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.