获取一个单词的所有可能的组合,使用小写/大写字母


14

我想编写一个bash脚本来打印某个单词(例如harley)的所有可能的大小写排列:

harley
harleY
harlEy
harLey
...
HARLey
HARLEy
HARLEY

我朴素的解决方案是为此特定单词编写第n个(n为len(word))嵌套的for循环:

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

但是,我将不得不再次为另一个单词编写脚本。

有没有更好的方法可以做到这一点?

Answers:


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'

为了好玩,尝试用“ supercalifragilisticexpialidocious”替换“ harley”。已经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,2014年

2
@ John1024我鼓励您发布答案,这是bash的一个printf
未被

10
评估回声$(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告诉外壳扩展{ Xx }括号序列。

1
好招:)。如果我可以接受两个答案,那么您的答案也将被接受!无论如何
都要

5

编辑2:这个答案是错误的。它不会产生应有的2 ^ n个组合。

编辑:我不知道为什么,但这个解决方案真的快相比,@Joeseph R. perl的解决方案。它运行“Supercalifragilisticexpialidocious”在小于0.3秒!

这是我要解决的问题:

#!/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,例如?
丹尼斯2014年

1
@Denis Yup你是对的。每次应该有2 ^ n个结果,其中n是原始字符串的字符数。这个答案是错误的。
ryanmjacobs 2014年

0

如果您希望使用现成的工具而不是编码,则可以使用TextMechanic(排列/组合生成器工具)和Unit-Conversion.info


他们究竟将如何获得和使用这些工具?
Jeff Schaller

通过添加一些细节(例如这些项目的主页或GitHub存储库)和/或是否可以从软件包中安装它们,可以大大改善此答案。
Anthony Geoghegan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.