gpt4 book ai didi

shell - sed 括号表达式和捕获组

转载 作者:行者123 更新时间:2023-12-01 09:41:45 28 4
gpt4 key购买 nike

我有以下一组需要通过 sed 处理的字符串:

start-pattern
[SYSTEM] capture ............................... FAIL [ 2.825 s]
[SYSTEM] capture ............................... FAIL [ 2.825 s]
[DEBUG] capture :: capture :: capture .......... FAIL [ 0.866 s]
[DEBUG] capture :: me :: capture capture capture FAIL [ 0.876 s]
[DEBUG] capture-me ............................. FAIL [ 0.361 s]
end-pattern

我想写一个 sed 表达式(如果可能最好使用 sed)来获取 [DEBUG] 之间的所有字符串 || [SYSTEM]FAIL [.*] 用于失败测试用例的每一行,不包括空格 和句点 AND 在文本 {start,end}-pattern 之间。

上述文本的输出应为以下一项或多项:

capture
capture
capture::capture::capture
capture::me::capture capture capture
capture-me

这是我尝试过的方法,但不适用于所有行:

sed -e 's/\[DEBUG\] \(.*\) :: \(.*\) :: \(.*\) \([^.]FAIL \[.*\]) \[.*/\1::\2::\3::\4/' -e 's/\[SYSTEM\] \(.*\) \..*/\1/'

最佳答案

以下是如何在任何 UNIX 系统上清楚、简单、健壮、高效且可移植地完成您的要求:

$ cat tst.awk
/start-pattern/ { inBlock=1 }
inBlock {
if ( sub(/^\[(DEBUG|SYSTEM)\]/,"") && sub(/FAIL.*/,"") ) {
gsub(/[[:space:].]/,"")
print
}
}
/end-pattern/ { inBlock=0 }

$ awk -f tst.awk file
capture
capture
capture::capture::capture
capture::me::capturecapturecapture
capture-me

请注意,您说过您希望输出不包括空格和句点。 因此上面的“捕获”之间没有空格。如果您真正想要的只是排除 :: 周围以及输出行开始/结束处的空格,那么这只是一个调整:

$ cat tst.awk
/start-pattern/ { inBlock=1 }
inBlock {
if ( sub(/^\[(DEBUG|SYSTEM)\]/,"") && sub(/FAIL.*/,"") ) {
gsub(/[[:space:]]*::[[:space:]]*/,"::")
gsub(/^[[:space:]]+|[[:space:]]+$|[.]/,"")
print
}
}
/end-pattern/ { inBlock=0 }

$ awk -f tst.awk file
capture
capture
capture::capture::capture
capture::me::capture capture capture
capture-me

关于shell - sed 括号表达式和捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42456350/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com