
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 "{}"
1行に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」を次に変えてみてください。「スーパーカリフォルニアの脆弱性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
次に、シェルに{を使用して拡張するように指示する簡単な問題です。X、X中かっこシーケンス。
答え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}