Regex 如果找到匹配项,则在两种模式之间打印文本
我有一个包含多个重复模式的文件。 如果在每个匹配模式之间找到匹配,我想打印相关信息 例如:Regex 如果找到匹配项,则在两种模式之间打印文本,regex,awk,sed,grep,perl,Regex,Awk,Sed,Grep,Perl,我有一个包含多个重复模式的文件。 如果在每个匹配模式之间找到匹配,我想打印相关信息 例如: START PATTERN1 pat1 START PATTERN2 pat2 text1 0 text2 2 text3 8 text4 10 STOP PATTERN2 pat2 STOP PATTERN1 pat1 START PATTERN1 pat3 START PATTERN2 pat4 text1 0 text2 2 text3 10 text4 10 STOP PATTERN2 pat4
START PATTERN1 pat1
START PATTERN2 pat2
text1 0
text2 2
text3 8
text4 10
STOP PATTERN2 pat2
STOP PATTERN1 pat1
START PATTERN1 pat3
START PATTERN2 pat4
text1 0
text2 2
text3 10
text4 10
STOP PATTERN2 pat4
STOP PATTERN1 pat3
我想从开始模式1开始搜索
如果我发现text38存在
我需要打印出pat1和pat2作为发生这种情况的指示器
所以我可以在这场比赛之前开始,也可以在这场比赛之后停止
但除此之外我什么都不想做
因此,从上面的文件中,我将运行命令,输出结果将是:
第1部分
第二部分
因为这是其中唯一包含text3 8的部分。
有什么帮助吗?这是你想要的吗
awk '
$0 ~ "START PATTERN1"{l=1}
l==1 && $0 ~ /^text3 8$/{l++}
l==2 && $1 == "STOP"{print $NF}
' file
根据您的评论,仅当text3不是8时才打印:
$ awk '
$0 ~ "START PATTERN1"{l=1}
l==1 && $0 ~ /^text3 [^8]$/{l++}
l==2 && $1 == "STOP"{print $NF}
' file
与:
您的模式是这样嵌套的,您需要保留匹配行之前的完整匹配模式集?因此,您将在文件中看到相同的模式重复多次。但我只需要打印信息,如果text38存在。如果text32存在-我不在乎。这并没有回答我的问题。模式是像您的示例中那样嵌套,还是只是重复?您是否需要一个单一的开始模式,或者您看到的所有可能与您正在寻找的匹配线之前的停止模式不匹配的开始模式?请进一步解释。。。这是一个配置输出。所以我需要找到哪些对象设置了配置参数。问题是在两种模式之间进行搜索-但在这两种模式之间有条件地匹配输出信息。您确实需要回答我的问题和/或给我们实际的代表性输出。l>1,多个匹配和第三种模式不会触发。但我也不确定这是否符合他们的要求,尽管可能。相关信息可以在之前或之后提取,因为它存在于两个位置。我会尝试用更好的数据示例和预期输出更新原始文本。似乎符合规格?!事实上,我想是的。再来一把扳手-如果我只想在text3不是8的情况下打印它怎么办?这可行吗?斯普特尼克-你太棒了。。。好的,我还有一个问题。我还可以报告其他项目。如何从text3点反向搜索?
$ perl -00lne '
foreach $count (1..2) {
print $1 if
/START\s+PATTERN${count}.*^text3\s+8\s*\n.*?STOP\s+PATTERN${count}\s+(\w+)/ms}
' file