小文字/大文字の単語のすべての可能な組み合わせを取得します


14

特定の単語、たとえば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

ただし、別の単語のスクリプトを再度コーディングする必要があります。

これを達成するためのより良い方法はありますか?

回答:


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 "{}"

行ごとに1つの単語が絶対に必要な場合は、

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 do echo $ w; done
mattdm 14年

4
さらにシンプルな1行に1つのソリューション:printf '%s\n' {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}
John1024 14年

2
John1024 I @答えとして、それはbashのののアンダー感謝の特徴であることを掲示することをお勧めprintf
steeldriver

10
eval echo $(echo " word " | sed 's /./ {\ U&、\ L&} / g')
  • sed 's/./{&,&}/g'になりますFoo{F,F}{o,o}{o,o}、これはまったく役に立たないでしょう。ただし、\Uand \Lを追加すると、各文字の大文字と小文字が取得されます。すなわち、{F,f}{O,o}{O,o}
  • それからeval、{ Xx }中括弧シーケンスを展開するようにシェルに指示するために使用するのは簡単なことです。

1
素敵なトリック:)。私が2つの答えを受け入れることができれば、あなたのものも受け入れられるでしょう!とにかく投票
ポリム14年

5

編集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


1
コードは明らかにすべての結果を印刷するわけではありません。ではharley、あなたは64件の結果、の持っている必要がありますharLEYたとえば、?
デニス14年

1
@Denis Yupあなたは正しい。2 ^ nの結果が表示されるたびに、nは元の文字列の文字数です。この答えは間違っています。
ryanmjacobs 14年

0

コーディングの代わりに既製のツールを使用する場合は、TextMechanic(置換/組み合わせジェネレーターツール)とUnit-Conversion.infoを使用できます。


これらのツールを正確にどのように入手して使用しますか?
ジェフシャラー

これらのプロジェクトのホームページやGitHubリポジトリなどの詳細を追加したり、パッケージからインストールできる場合は、この回答を大幅に改善できます。
アンソニーG-モニカの正義
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.