Dapatkan semua kemungkinan kombinasi kata dalam huruf kecil / besar

14

Saya ingin menulis skrip bash untuk mencetak semua kemungkinan permutasi huruf besar dan kecil dari kata tertentu, misalnya harley:

harley
harleY
harlEy
harLey
...
HARLey
HARLEy
HARLEY

Solusi naif saya adalah menulis n-th (n is len (word)) bersarang untuk-loop untuk kata khusus ini:

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

Namun, saya harus kode script untuk kata yang berbeda lagi.

Apakah ada cara yang lebih baik untuk mencapai ini?

polym
sumber

Jawaban:

18

Solusi yang sedikit lebih baik:

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

Untuk skalabilitas penuh:

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

Jika Anda benar-benar harus memiliki satu kata per baris, ikuti

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

terima kasih atas komentar mattdm

Versi scalable yang sesuai adalah:

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

Untuk bersenang-senang, coba ganti "harley" dengan "supercalifragilisticexpialidocious" Sudah 5 menit dan komputer saya masih berderak pada yang satu ini dan mungkin tidak akan pernah selesai :)

Joseph R.
sumber
1
untuk w di {h, H} {a, A} {r, R} {l, L} {e, E} {y, Y}; do echo $ w; done
mattdm
4
Solusi satu-per-line yang masih lebih sederhana:printf '%s\n' {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}
John1024
2
@ John1024 Saya mendorong Anda untuk memposting itu sebagai jawaban, itu adalah fitur yang kurang dihargai dari bash'sprintf
steeldriver
10
eval echo $ (echo " word " | sed 's /./ {\ U &, \ L &} / g')
  • sed 's/./{&,&}/g'akan berubah Foomenjadi {F,F}{o,o}{o,o}, yang akan sangat tidak berguna. Tetapi tambahkan \Udan \Ldan Anda mendapatkan huruf besar dan kecil dari setiap huruf; yaitu {F,f}{O,o}{O,o},.
  • Maka itu masalah sederhana menggunakan evalmemberitahu shell untuk memperluas urutan kurung { X , x }.
Scott
sumber
1
Trik yang bagus :). Jika saya dapat menerima dua jawaban, jawaban Anda juga akan diterima! Terpilih lagi
polym
5

EDIT 2: Jawaban ini salah. Itu tidak menghasilkan 2 kombinasi seperti yang seharusnya.

EDIT: Saya tidak tahu mengapa, tetapi solusi ini benar - benar cepat dibandingkan dengan solusi perl oleh @ Joeseph R. Ini menjalankan "Supercalifragilisticexpialidocious" dalam waktu kurang dari 0,3 detik!

Inilah celah saya untuk itu:

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

Menjalankannya:

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

Silakan garpu dan memodifikasinya, saya yakin itu bisa dioptimalkan. https://gist.github.com/ryanmjacobs/4c02ad80f833dee0c307

ryanmjacobs
sumber
1
Kode jelas tidak mencetak semua hasil. Dengan harleyAnda harus memiliki 64 hasil, di mana harLEY, misalnya?
Denis
1
@Enis Yup kau benar. Setiap kali harus ada 2 ^ n hasil, di mana n adalah jumlah karakter dari string asli. Jawaban ini salah.
ryanmjacobs
0

Jika Anda lebih suka menggunakan alat siap alih-alih pengkodean, Anda dapat menggunakan TextMechanic (alat pembangkit permutasi / kombinasi) dan Unit-Conversion.info

Dicampuradukkan
sumber
Bagaimana cara mereka mendapatkan dan menggunakan alat-alat itu, tepatnya?
Jeff Schaller
Jawaban ini dapat sangat ditingkatkan dengan menambahkan beberapa detail seperti halaman rumah atau repositori GitHub untuk proyek-proyek ini dan / atau jika mereka dapat diinstal dari suatu paket.
Anthony G - keadilan untuk Monica