我想要找出并显示在文件前 2,000 行中找到的 TTT 子字符串的总数。
我一直在用grep直到我测试了它,才意识到它不能识别子字符串。
答案1
如果您要查找文件中连续 3 个“T”字符的出现情况,可以使用 grep 进行查找。您尝试过哪些方法,但没有成功?如果您只想检查文件的前 2,000 行,您可以管道的输出头命令放入 grep 中。例如,head -n 2000 somefile.txt | grep "TTT"
如果您想要统计文件中包含“TTT”的行数,可以使用以下命令:
head -n 2000 somefile.txt | grep -c "TTT"
如果某些行可能出现多次,而您想要计算所有出现次数,而不仅仅是包含“TTT”的行数,则使用以下-o
选项grep,它将在单独的行上显示每个匹配项,然后将输出导入到厕所命令,然后将显示文件前 2000 行中“TTT”出现次数的计数:
head -n 2000 somefile.txt | grep -o "TTT" | wc -l
答案2
解释
通常,在 (6 个 T)TTT
中搜索 (3 个 T)TTTTTT
只会产生 2 个匹配项,因为在找到上一个匹配项后会立即搜索下一个匹配项。
我将尽力说明:
TTTTTT
^ set starting position
TTTTTT
‾‾‾ found a match for TTT
TTTTTT
‾‾‾^ set next starting position
TTTTTT
‾‾‾ found a match for TTT
TTTTTT
^ end of stream
解决方案
如果您想考虑TTTTTT
四个实例TTT
,那么我建议您只匹配一个字符,然后使用环视四周完成你的匹配模式。
我将在我的解决方案中使用前瞻:
head -2000 file | /usr/gnu/bin/grep -P -o 'T(?=TT)' | wc -l
该部分的解释grep
:
- 使用
grep
支持 Perl 正则表达式的来使用前瞻;在我的系统中,我需要指定/usr/gnu/bin/grep
-P
激活 Perl 正则表达式模式-o
在单独的行上显示每个匹配项,以便wc -l
计算每个匹配项'T(?=TT)'
是一个要匹配的正则表达式T
,后面跟着TT
(使用前瞻);找到匹配项后,正则表达式引擎将从第二T
尝试找到下一个匹配项,允许那第二个T
如果符合模式则成为下一场比赛的一部分。
例子
使用评论中的示例字符串:
- 韓國語言學家
并使用上述正则表达式进行处理:
echo 'JKHFSDTTTJSDJHTTTTTKSJTIITTT' | /usr/gnu/bin/grep -P --color=always 'T(?=TT)'
将产生:
- 杰卡斯达电视特勤局特快专递TTKSJTII电视TT(即它将突出显示 5 个 T)
意思是:
- 它找到 5 个匹配项 :)
插图:
JKHFSDTTTJSDJHTTTTTKSJTIITTT
^ set starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
^ end of stream