如何在文本文件中进行多行模式匹配



我从测试结果中得到下面的文件,这个文件包含100000或更多的测试用例条目。

文件内容:

Iteration is 1
Testcase is passed
Iteration is 2
Testcase is passed
Iteration is 3
Testcase is passed
Iteration is 4
Testcase is failed
Iteration is 5
Testcase is failed
Iteration is 6
Iteration is 7
Testcase is failed
Iteration is 8
Iteration is 9
Iteration is 10
Testcase is failed
Iteration is 11
Testcase is passed

对于一些测试用例迭代,如6,8,9,缺少判决。这些迭代没有通过或失败之分。

我只是想找出哪个迭代测试用例判决缺失了。

我在gvim中打开文件,并试图找到和删除模式,如Iteration is .*n.*passedIteration is .*n.*failed,但它没有工作。

谁能建议如何找到没有像

这样的判决的迭代?
Iteration is 6
Iteration is 8
Iteration is 9

你可以使用"find"在任何合适的编辑器中使用以下regex:

Iteration is d+nTestcase is w+n

并将匹配项替换为空字符串。

例如,在vim中,假设游标位于文件

的开头
:1,$s/Iteration is d+nTestcase is w+n//

可以。

一旦完成,文件将包含没有计数失败/通过结果的行。

您也可以使用相同的策略来编写perl脚本-我把它留给您。

下面是一个简单的Vim解决方案:

:g/passed|failed/norm k2dd

解释:

  • :g/<pattern>/<command>对匹配<pattern>的每一行执行<command>

  • passed|failed是我们的模式。它匹配passedfailed的行。将|视为与passedfailed匹配的"或";

  • norm k2dd是我们的命令。:help :norm用于在正常模式外执行正常模式命令。我们到了……

    • 将光标移动到k匹配行上方的行,
    • 删除两行2dd,有效地从文件中删除所有通过或失败的测试用例的迭代。

在缓冲区中还剩下以下几行:

Iteration is 6
Iteration is 8
Iteration is 9

,一旦我们有了我们需要的信息,我们可以用u恢复这个变化。

请尝试以下操作:

awk '
/^Iteration/ {
if (prev) print prev
prev = $0
}
/^Testcase/ {
prev = ""
}
END {
if (prev) print prev
}
' file.txt

结果:

Iteration is 6
Iteration is 8
Iteration is 9
  • 变量prev保存Iteration之前的记录。
  • 当记录以Iteration开始,设置变量prev时,这意味着最后一个Iteration记录没有相应的通过/失败记录。
  • 当记录以Testcase开头时,清空变量prev
  • END {}块处理最后一次迭代。

最新更新