egrep搜索:每个字母最多出现2次

时间:2013-01-02 15:15:41

标签: regex expression md5 grep

好的,我有这个问题,我有一个md5的列表,旁边的一个单词用空格隔开,我需要过滤掉一些行。

示例摘录:

...
F08A4C9263AD215D70B9C216F0B385CB wrapup
7B286E6F0615D64ACD4A7BC3578871DD wrath
8E35BA3D27A7730840EB1694386F69A0 wrathful
096762EA6790EDA22BF2369347FD53AC wreak
56AC6677205EB591A7173BADBB610F5C wreath
A85C0CB6C0367AF9D23442DF56EC9E1C wreathe
9E44AAE612306D44B91C4162DB5C26B7 wreck
6D9C795CBB3075DC1A482F6F78DC6D68 wreckage
BD907BC4DC65934D133BD5C472B78CC0 wrench
758C70E9B6F437D49D98D92E28E95939 wrest
81A4471F73DFDA0B534F58F4E1501FAB wrestle
94183CC7C7A66338DE89DB9C7460A8A2 wretch
AFEED5CE5BACCEC17EC54E68A97CCD0F wriggle
...

我需要一个正则表达式 for(e)grep ,它会拉出每一个字母(所以[A-F])最多只出现2次的每一行。 所以一个例子就是:

4F2048B829C2834A23832F28928DE38E turtle

如果有人能帮助我,我会非常感激!

2 个答案:

答案 0 :(得分:1)

您可以使用:

egrep -v "^\S*([A-F])\S*\1\S*\1" inputfile

这将列出不包括字母A-F的每一行在同一行重复三次。

编辑:更改为避免匹配单词中的大写字符...

答案 1 :(得分:0)

你提到过:

  

拉出每一个字母(所以[A-F])只出现2的每一行   倍数。

所以我的理解是,所选行应包含0-2 [A-F]。基于此,以下awk oneliner应该完成这项工作:

awk  'BEGIN{FS=""}{delete a;for(i=1;i<=NF;i++)if($i~/[A-F]/){a[$i]++;if(a[$i]>2)next}}1' file

测试

注意,给定输入的 NO 行符合您的要求。所以我在最后添加了“turtle”行:

kent$  echo "F08A4C9263AD215D70B9C216F0B385CB wrapup
7B286E6F0615D64ACD4A7BC3578871DD wrath
8E35BA3D27A7730840EB1694386F69A0 wrathful
096762EA6790EDA22BF2369347FD53AC wreak
56AC6677205EB591A7173BADBB610F5C wreath
A85C0CB6C0367AF9D23442DF56EC9E1C wreathe
9E44AAE612306D44B91C4162DB5C26B7 wreck
6D9C795CBB3075DC1A482F6F78DC6D68 wreckage
BD907BC4DC65934D133BD5C472B78CC0 wrench
758C70E9B6F437D49D98D92E28E95939 wrest
81A4471F73DFDA0B534F58F4E1501FAB wrestle
94183CC7C7A66338DE89DB9C7460A8A2 wretch
AFEED5CE5BACCEC17EC54E68A97CCD0F wriggle
4F2048B829C2834A23832F28928DE38E turtle"|awk  'BEGIN{FS=""}{delete a;for(i=1;i<=NF;i++)if($i~/[A-F]/){a[$i]++;if(a[$i]>2)next}}1'                          
4F2048B829C2834A23832F28928DE38E turtle