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 ).