bash 中的拼字游戏助手

AvZ*_*AvZ 5 grep wildcards brace-expansion

我正在尝试在 bash 中创建一个拼字游戏助手,当给定一个字符列表时,它会找到/usr/share/dict/words文件中的所有单词。
例如,当给定字母时a,c,r,t
单词cart将匹配
单词car也将匹配
单词carat匹配

但是,如果a,a,c,r,t给出
Thencarat将匹配。

我试图找出是否可以只使用grep,我怀疑大括号扩展
{a,c,r,t}{a,c,r,t}可能对生成所有可能的字母组合有用,但相反,我遇到了类似的错误

grep: aaac: No such file or directory
grep: aaar: No such file or directory
grep: aaat: No such file or directory   
Run Code Online (Sandbox Code Playgroud)

运行命令时
$ grep {a,c,r,t}{a,c,r,t}{a,c,r,t}{a,c,r,t} /usr/share/dict/words

当我使用像"{a,c,r,t}{a,c,r,t}"or 之类的引号时"\{a,c,r,t\}\{a,c,r,t\}",大括号扩展根本不起作用

我知道上面的命令不应该作为拼字游戏的助手,但错误仍然出乎意料。命令有什么问题,我该如何解决?另外,可以grep用某种方式来制作拼字游戏助手吗?

Sté*_*las 5

正则表达式不是此类工作的最佳工具。我会做类似的事情:

\n\n
perl -CLASD -lne \'\n  BEGIN{$l0{$_}++ for (split "", shift)}\n  %l = %l0; for (split "") {next LINE unless $l{$_}--}\n  print\' aacrt < /usr/share/dict/words\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者因为(至少在法语和英语以及其他一些使用拉丁字母的语言中),拼字游戏只有 26 个大写字母 A 到 Z(\xc3\xa9t\xc3\xa9 写为 ETE,c\xc5\x93ur 写为 COEUR ),与 GNU iconv

\n\n
iconv -t us//TRANSLIT < /usr/share/dict/words |\n  perl -CLASD -lne \'\n    BEGIN{$l0{$_}++ for (split "", uc shift)}\n    %l = %l0; for (split "", uc $_) {next LINE unless $l{$_}--}\n    print\' croeu\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者以原始形式输出:

\n\n
perl -CLASD -MText::Unidecode -lne \'\n  BEGIN{$l0{$_}++ for (split "", uc shift)}\n  %l = %l0; for (split "", uc unidecode $_) {next LINE unless $l{$_}--}\n  print\' croeu < /usr/share/dict/word\n
Run Code Online (Sandbox Code Playgroud)\n


Ant*_*hon 2

这里发生的事情是 {a,c,r,t}{a,c,r,t}{a,c,r,t}{a,c,r,t}由您正在使用的 shell 扩展的。这意味着第一个 ( ) 是将搜索、等aaaa的模式,就像您键入:grepaaacaaar

grep aaaa aaac aaar aaat aaca ..... /usr/share/dict/words
Run Code Online (Sandbox Code Playgroud)

将搜索模式放在单引号中以防止发生这种情况:

grep '{a,c,r,t}{a,c,r,t}{a,c,r,t}{a,c,r,t}' /usr/share/dict/words
Run Code Online (Sandbox Code Playgroud)

另一方面,我不确定您是否在这里使用正确的 grep 语法。我会用:

grep '[acrt][acrt][acrt][actr]' /usr/share/dict/words
Run Code Online (Sandbox Code Playgroud)

它匹配 4 个字符的组合,正如 @mueh 评论的那样:

grep -xE '[acrt]{1,4}' /usr/share/dict/words
Run Code Online (Sandbox Code Playgroud)

匹配这些字母的 1-4 个组合。

  • 我建议使用 ''^[acrt]{1,4}$' `,因为 OP 也想匹配“car”。 (2认同)