Sem manter a linha:
awk -v n=3 '/foo/{n--}; n > 0'
Mantendo a linha:
awk -v n=3 'n > 0; /foo/{n--}'
Embora possamos melhorar um pouco para que paremos e paremos de ler assim que encontrarmos o terceiro foo
:
awk -v n=3 '/foo/{n--; if (!n) exit}; {print}' # not-keep
awk -v n=3 '{print}; /foo/{n--; if (!n) exit}' # keep
sed
seria mais complicado. Você precisaria manter a contagem de ocorrências foo como um número de caracteres no espaço de espera como:
Guarde:
sed '
/foo/{
x;s/^/x/
/x\{3\}/{
x;q
}
x
}'
Não manter:
sed -ne '/foo/{x;s/^/x/;/x\{3\}/q;x;}' -e p