소문자 / 대문자로 단어의 가능한 모든 조합 얻기


14

할리와 같은 특정 단어의 가능한 모든 소문자 및 대문자 순열을 인쇄하기 위해 bash 스크립트를 작성하고 싶습니다.

harley
harleY
harlEy
harLey
...
HARLey
HARLEy
HARLEY

내 순진한 해결책은이 특정 단어에 대해 n 번째 (n is len (word)) 중첩 for 루프를 작성하는 것입니다.

#!/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
{h, H} {a, A} {r, R} {l, L} {e, E} {y, Y}에서 w의 경우; echo $ w; done
mattdm

4
여전히 간단한 한 줄 솔루션 :printf '%s\n' {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}
John1024

2
@ John1024 답변으로 bash 's의 평가되지 않은 기능입니다.printf
steeldriver

10
eval echo $ (echo " word "| 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

편집 2 : 이 답변이 잘못되었습니다. 2 ^ n 조합을 생성하지 않습니다.

편집 : 나는 이유는 모르겠지만,이 솔루션이되어 정말 빠른 미만 0.3 초에 @Joeseph R.에 의해 펄 솔루션에 비해 그것은 "Supercalifragilisticexpialidocious"를 실행!

여기 내 균열이 있습니다.

#!/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예를 들어,?
Denis

1
@Denis Yup 당신이 맞아요. 2 ^ n 개의 결과가있을 때마다 n은 원래 문자열의 문자 수입니다. 이 답변은 잘못되었습니다.
ryanmjacobs

0

코딩 대신 준비된 도구를 사용하려면 TextMechanic (순열 / 조합 생성기 도구) 및 Unit-Conversion.info를 사용할 수 있습니다.


그들은 어떻게 정확하게 그 도구를 구하고 사용하겠습니까?
Jeff Schaller

이 답변은 이러한 프로젝트에 대한 홈 페이지 또는 GitHub 리포지토리와 같은 몇 가지 세부 정보를 추가하거나 패키지에서 설치할 수있는 경우 크게 향상 될 수 있습니다.
Anthony Geoghegan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.