Bir kelimenin tüm olası kombinasyonlarını küçük / büyük harflerle alma


14

Belirli bir kelimenin tüm olası küçük ve büyük harf permütasyonlarını yazdırmak için bash betiği yazmak istiyorum, örneğin: harley:

harley
harleY
harlEy
harLey
...
HARLey
HARLEy
HARLEY

Benim naif çözüm n-th (n len (word)) iç içe for-loop bu özel kelime için yazmaktır:

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

Ancak, ben yine farklı bir kelime için kod kodlamak zorunda kalacak.

Bunu başarmanın daha iyi bir yolu var mı?

Yanıtlar:


18

Biraz daha iyi bir çözüm:

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

Tam ölçeklenebilirlik için:

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

Her satıra mutlaka bir kelime girmeniz gerekiyorsa,

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

mattdm yorumuna teşekkürler

Karşılık gelen ölçeklenebilir sürüm:

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

Eğlenmek için, "harley" yerine "supercalifragilisticexpialidocious" yazmayı deneyin. 5 dakika oldu ve bilgisayarım hala bu konuda çatırdadı ve muhtemelen asla bitmeyecek :)


1
{h, H} {a, A} {r, R} {l, L} {e, E} {y, Y} içindeki w için; echo $ w; bitti
mattdm

4
Daha basit bir satır başına çözüm:printf '%s\n' {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}
John1024

2
@ John1024 Bunu bir cevap olarak göndermenizi tavsiye ediyorum, bash'ın az takdir edilen bir özelliğiprintf
steeldriver

10
eval echo $ (echo " word " | sed 's /./ {\ U &, \ L &} / g')
  • sed 's/./{&,&}/g'açacak Fooiçine {F,F}{o,o}{o,o}oldukça yararsız olacaktır, hangi. Ama ekleyin \Uve \Lher harfin büyük ve küçük harfini alırsınız; yani {F,f}{O,o}{O,o}.
  • O zaman evalkabuğa { X , x } küme dizilerini genişletmesini söylemek basit bir konudur .

1
İyi numara :). İki cevabı kabul edebilseydim, senin de kabul edilirdi! Neyse oy
Polym

5

DÜZENLEME 2: Bu cevap yanlış. Gerektiği gibi 2 ^ n kombinasyon üretmez.

EDIT: Neden bilmiyorum, ama bu çözüm @Joeseph R tarafından perl çözüm ile karşılaştırıldığında gerçekten hızlı. 0.3 saniyeden daha kısa sürede "Supercalifragilisticexpialidocious" çalışır!

İşte benim çatlak:

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

Koş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

Çatallamak ve değiştirmek için çekinmeyin, eminim optimize edilebilir. https://gist.github.com/ryanmjacobs/4c02ad80f833dee0c307


1
Kod açıkça tüm sonuçları yazdırmıyor. İle harley64 sonuç olmalı harLEY, örneğin nerede ?
Denis

1
@Denis Yup haklısın. Her seferinde 2 ^ n sonuç olmalıdır; burada n, orijinal dizenin karakter sayısıdır. Bu cevap yanlış.
ryanmjacobs

0

Kodlama yerine hazır araçlar kullanmayı tercih ederseniz, TextMechanic (permütasyon / kombinasyon oluşturma aracı) ve Unit-Conversion.info kullanabilirsiniz


Bu araçları tam olarak nasıl alıp kullanacaklardı?
Jeff Schaller

Bu cevaplar, bu projeler için ana sayfalar veya GitHub depoları gibi birkaç ayrıntı ekleyerek ve / veya bir paketten kurulabiliyorsa büyük ölçüde geliştirilebilir.
Anthony Geoghegan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.