Linux如何用grep筛选含首尾字母相同(不区分大小写)单词的行
问题描述
我有如下格式的文本文件passwords.txt,其中每列的每个单词都是一个8位密码:
sie%Qu7s Kuux"oh9 ohc9ahG% hoe8Toh: Eix*ohd1 doh:bo2U Cu0doo|t zo`L9xaW fie5Du[h Phe8aid# Opu&fai5 ieZ<aek6 hu4ga&Di Oose}p1p aiD@oos2 nu-a1Fub ahqu5To/ ahtie[H3 ioK&u5Ai nei1Za#d poo_Th9r gu|aGh7h uZ%io2ah IeNah&v7 eif\e8AE Ieb,ing4 reph1oW* eeSh'ee8 Ah+ei4ai Oi0Ca,vu Esh1xe?e Wei&k4ic ue5OhQu. aaf-i8uP eedae%T5 sei?M9Pu ieH[oh2l ieh~ah8A aev"oo9A Ohf"i8de Foh:x2zi aLoo'qu2 Ia6aig-e La{vie1E IeFoh{cI Au_h7Hee Se)f4ebi Cah$yu7m
我需要打印其中包含任意一个首尾字母相同的单词的行,匹配时不区分字母大小写。我尝试使用如下grep命令实现:
cat passwords.txt | grep -e ' \([A-Z]\)......\1 ' -e ' \([a-z]\)......\1 '
但该命令只能匹配首尾字母大小写完全相同的单词,无法满足不区分大小写的需求,例如如下行应该被匹配:
Foh:x2zi aLoo'qu2 Ia6aig-e La{vie1E IeFoh{cI Au_h7Hee Se)f4ebi Cah$yu7m
我的预期输出结果如下:
eif\e8AE Ieb,ing4 reph1oW* eeSh'ee8 Ah+ei4ai Oi0Ca,vu Esh1xe?e Wei&k4ic sie%Qu7s Kuux"oh9 ohc9ahG% hoe8Toh: Eix*ohd1 doh:bo2U Cu0doo|t zo`L9xaW ue5OhQu. aaf-i8uP eedae%T5 sei?M9Pu ieH[oh2l ieh~ah8A aev"oo9A Ohf"i8de Foh:x2zi aLoo'qu2 Ia6aig-e La{vie1E IeFoh{cI Au_h7Hee Se)f4ebi Cah$yu7m ahqu5To/ ahtie[H3 ioK&u5Ai nei1Za#d poo_Th9r gu|aGh7h uZ%io2ah IeNah&v7
解决方案
核心是给grep加-i参数实现大小写不敏感匹配,无需分开写大小写匹配规则,正确命令如下:
grep -i '\([a-z]\).\{6\}\1' passwords.txt
参数解释:
-i:开启大小写忽略模式,匹配时A和a会被判定为相同字符\([a-z]\):捕获单词的第一个字母,因为有-i参数,无需额外匹配大写字母.{6}:匹配8位密码中间的任意6个字符\1:反向引用第一个捕获的字母,大小写不一致也能成功匹配
如果要避免误匹配单词内部的8个字符组合,可以加边界校验,只匹配被空格分隔、或位于行首行尾的独立密码:
grep -i '\(^\| \)\([a-z]\).\{6\}\2\( \|$\)' passwords.txt
执行上述命令即可得到预期的输出结果。
内容的提问来源于stack exchange,提问作者DOS HASAN
相关产品推荐
相关产品推荐

