我有一个如下所示的密码列表:
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
命令,它对与给定正则表达式匹配的每一行执行特定操作。我使用m
ove 命令将匹配行放置在“第 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