단어의 가능한 모든 소문자/대문자 조합을 가져옵니다.

단어의 가능한 모든 소문자/대문자 조합을 가져옵니다.

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

harley
harleY
harlEy
harLey
...
HARLey
HARLEy
HARLEY

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

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

그러나 다른 단어로 다시 스크립트를 작성해야 합니다.

이를 달성하는 더 좋은 방법이 있습니까?

답변1

약간 더 나은 솔루션:

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"를 다음으로 바꿔보세요.“슈퍼 캘리포니아 취약성Expialidocious”5분이 지났는데도 내 컴퓨터가 계속 작업 중이므로 완료되지 않을 수도 있습니다. :)

답변2

echo$(echo"를 평가합니다.단어" | sed 's/./{\U&,\L&}/g')
  • sed 's/./{&,&}/g', 그것은 쓸모가 없을 Foo{F,F}{o,o}{o,o}입니다. 그러나 추가하면 \U\L문자의 대문자와 소문자를 제공합니다 {F,f}{O,o}{O,o}.
  • eval그런 다음 쉘에 {를 사용하여 확장하도록 지시하는 간단한 문제입니다.엑스,엑스중괄호 시퀀스.

답변3

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

편집하다:이유는 모르겠지만 이 솔루션은진짜@Joeseph R의 Perl 솔루션에 비해 훨씬 빠릅니다. 0.3초 이내에 "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

답변4

원하는 형식으로 출력할 상위 답변을 기반으로 몇 가지 간단한 함수를 작성했습니다.

to_lower () 
{ 
    tr '[[:upper:]]' '[[:lower:]]' <<< $@
}
to_upper () 
{ 
    tr '[[:lower:]]' '[[:upper:]]' <<< $@
}
generate_permutations () 
{ 
    local perm="$@";
    perl -e '@foo = split(//, $ARGV[0]);foreach my $c (@foo){print "$c $c\n";}' ${perm} | while read l u; do
        echo "{$(to_lower ${l}),$(to_upper $u)}";
    done | tr -d '\n';
    echo
}

사용법/예:

$ generate_permutations foobar
{f,F}{o,O}{o,O}{b,B}{a,A}{r,R}

관련 정보