[英]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
对于某些测试用例迭代,例如6
、 8
、 9
判决缺失。这些迭代没有通过或失败。
我只想找到缺少哪个迭代测试用例的判断。
我在 gvim 中打开文件并尝试查找和删除模式,如Iteration is.*\n.*passed
和Iteration 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
的行。 想想\|
如“或”:“匹配passed
或failed
”。
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 {}
块处理最后一次迭代。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.