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用某种方式来制作拼字游戏助手吗?
正则表达式不是此类工作的最佳工具。我会做类似的事情:
\n\nperl -CLASD -lne \'\n BEGIN{$l0{$_}++ for (split "", shift)}\n %l = %l0; for (split "") {next LINE unless $l{$_}--}\n print\' aacrt < /usr/share/dict/words\nRun Code Online (Sandbox Code Playgroud)\n\n或者因为(至少在法语和英语以及其他一些使用拉丁字母的语言中),拼字游戏只有 26 个大写字母 A 到 Z(\xc3\xa9t\xc3\xa9 写为 ETE,c\xc5\x93ur 写为 COEUR ),与 GNU iconv:
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\nRun Code Online (Sandbox Code Playgroud)\n\n或者以原始形式输出:
\n\nperl -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\nRun Code Online (Sandbox Code Playgroud)\n
这里发生的事情是 {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 个组合。