将具有特定顺序的所有单词移至列表顶部

将具有特定顺序的所有单词移至列表顶部

我有一个如下所示的密码列表:

aaaa00
aaaa01
aaaa02
...
zzzz97
zzzz98
zzzz99

我想将具有此模式的所有单词移动到列表的开头(文本文件):

元音-辅音-元音-辅音-XX

我怎样才能做到这一点?谢谢。

答案1

使用ex

vowel='[AaEeIiOoUu]'
cons='[BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz]'
printf '%s\n' "g/^$vowel$cons$vowel$cons[0-9][0-9]\$/m 0" x | ex file.txt

另一种方法,使用set ic,也称为set ignorecase

vow='[aeiou]'
cns="[$(printf %s {a..z} | tr -d "$vow")]"
printf '%s\n' 'set ignorecase' "g/^$vow$cns$vow$cns[0-9][0-9]\$/m 0" x | ex test.txt

这些答案是符合 POSIX 标准。每个命令的核心是g命令,它对与给定正则表达式匹配的每一行执行特定操作。我使用move 命令将匹配行放置在“第 0 行”之后,也就是说,将它们移动到文件的开头。


顺便问一下,你在做什么?手动编辑密码类型?

对于代码高尔夫来说这个怎么样:

printf %s\\n {a,e,i,o,u}{b..z}{a,e,i,o,u}{b..z}{00..99}|grep -ve^.{,..}\[eiou]

在那里,我仅使用 78 个字节就生成了您感兴趣的所有组合! :P

答案2

将以元音-非元音-元音-非元音开头的所有行移动到文件的开头:

{ grep -i '[aeiouy][^aeiouy][aeiouy][^aeiouy]' input; grep -iv '[aeiouy][^aeiouy][aeiouy][^aeiouy]' input; } >outfile

如果“非元音”还不够好,请替换[^aeiouy]为辅音列表:[bcdf...]

例子

考虑这个输入文件:

$ cat >input
asasxx
bsbsxx
esesxx
wswsxx

运行我们的命令:

$ { grep -i '[aeiouy][^aeiouy][aeiouy][^aeiouy]' input; grep -iv '[aeiouy][^aeiouy][aeiouy][^aeiouy]' input; } >outfile

这是输出文件:

$ cat outfile
asasxx
esesxx
bsbsxx
wswsxx

相关内容