如何在同一字符的两次出现之间打印行?

How to print lines between two occurrences of the same character?

我有以下格式的非常大的文本文件:

>randomheader1 some info flag1
data
moredata
someextradata
>randomheader2 some info flag2
littledata
somedata
>randomheader3 some info flag1
one
two
three
four
>randomheader4 some info flag3
....

我想将包含 flag1 的行之后的行输出到另一个文件中,例如:

>randomheader1 some info flag1
data
moredata
someextradata
>randomheader3 some info flag1
one
two
three
four

我一直在阅读以寻找解决方案,我检查了 ,但是由于我正在寻找的匹配模式是相同的字符(即 >),所以它没有工作。我正在 bash.

中寻找解决方案

使用 awk

awk '{if([=10=]~/^>/){ if([=10=]~/flag1/) {flag="Y"} else {flag=""}} }flag '

演示:

$cat temp.txt 
>randomheader1 some info flag1
data
moredata
someextradata
>randomheader2 some info flag2
littledata
somedata
>randomheader3 some info flag1
one
two
three
four
>randomheader4 some info flag3
$awk '{if([=11=]~/^>/){ if([=11=]~/flag1/){flag="Y"} else {flag="" } }}flag ' temp.txt
>randomheader1 some info flag1
data
moredata
someextradata
>randomheader3 some info flag1
one
two
three
four
$

假设数据文件不包含任何空字符 ('\0'),纯 bash 的解决方案可能是:

$猫过滤器

#!/bin/bash

in_flag=
while IFS= read -r line; do
    case $line in
        \>*\ flag1) in_flag=t ;;
        \>*) in_flag= ;;
    esac
    [[ -n $in_flag ]] && echo "$line"
done

运行 等于

./filter < datafile > outfile