Talvez algo como:
grep -nPo '(?=(\((?:[^()]++|(?1))*\)) (?=\(VP)(?1) (?=\(NP)(?1))\(NP' |
cut -d: -f1 | uniq -c
Ou seja, ele corresponde a (NP
desde que seja o início de um (NP *) (VP *) (NP *)
em que usamos a correspondência recursiva PCRE para as partes (...)
(a parte (\((?:[^()]++|(?1))*\))
direto da página do manual pcrepattern ).