解释

解释

我想要找出并显示在文件前 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

相关内容