繁体   English   中英

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

[英]How to do multiline pattern matching in text file

我从测试结果中获取以下文件,该文件包含 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

对于某些测试用例迭代,例如689判决缺失。这些迭代没有通过或失败。

我只想找到缺少哪个迭代测试用例的判断。

我在 gvim 中打开文件并尝试查找和删除模式,如Iteration is.*\n.*passedIteration is.*\n.*failed但它不起作用。

任何人都可以建议如何找到没有类似判决的迭代

Iteration is 6
Iteration is 8
Iteration is 9

您可以使用以下正则表达式在任何体面的编辑器中进行“查找”:

Iteration is \d+\nTestcase is \w+\n

并用空字符串替换匹配项。

例如在 vim 中,假设 cursor 在文件的开头

:1,$s/Iteration is \d\+\nTestcase is \w\+\n//

成功了。

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

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

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

:g/passed\|failed/norm k2dd

解释:

  • :g/<pattern>/<command> > 在匹配<pattern>的每一行上执行<command> > 。

  • passed\|failed是我们的模式。 它匹配passed的行和failed的行。 想想\| 如“或”:“匹配passedfailed ”。

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

    • 将 cursor 移动到与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 {}块处理最后一次迭代。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM