Считать количество вхождений регулярного выражения в круглых скобках

Я пытаюсь подсчитать количество появлений регулярного выражения, содержащего выражение рекурсивных скобок. В моем конкретном случае я ищу подсчет вхождений по строке или по файлу (NP *) (VP *) (NP *) . Мой файл примера содержит (строка 4 имеет рекурсивный случай):

 $ more mini.example <parse> (NP (NN opposition)) (VP et) (NP gouvernement) (NP (NN opposition)) (VP et) (NP gouvernement) (NP (NN opposition)) (VP et) (NP gouvernement) </parse> <parse> (NP (NN opposition)) (XP et) (NP gouvernement) (NP (NN opposition)) (VP et) (NP gouvernement) (NP (NN opposition)) (VP et) (NP gouvernement) </parse> <parse> (NP (NN opposition)) (VP et) (NP gouvernement) (NP (NN opposition)) (VP et) (NP gouvernement) </parse> <parse> (NP (NN opposition)) (VP et) (NP gouvernement (NP (NN opposition)) (VP et) (NP gouvernement)) </parse> <parse> (NP (NN opposition)) (VP et) (FP gouvernement) (NP (NN opposition)) (RP et) (NP gouvernement) </parse> <parse> (NP (NN opposition)) (VP et) </parse> <parse> (VP et) (NP gouvernement) </parse> 

Я хотел бы иметь такой вывод:

 3 1 2 2 2 3 2 4 0 5 0 6 

Я попробовал это:

 $ grep -Pon '(?<=\(NP ).*(?=\).*(?<=\(VP ).*(?=\).*(?<=\(NP ).*(?=\))))' mini.example | cut -d : -f 1 | uniq -c | sort -k 1 

Но выход:

 1 1 1 2 1 4 1 5 1 6 

Что отличается от желаемого. Он однозначно учитывает первую часть шаблона, даже если весь шаблон не соответствует, и рекурсия не может быть проверена. Спасибо за любую помощь.

Может быть, что-то вроде:

 grep -nPo '(?=(\((?:[^()]++|(?1))*\)) (?=\(VP)(?1) (?=\(NP)(?1))\(NP' | cut -d: -f1 | uniq -c 

То есть, он соответствует (NP при условии, что это начало (NP *) (VP *) (NP *) где мы используем рекурсивное сопоставление PCRE для (...) частей ( (\((?:[^()]++|(?1))*\)) прямо с страницы руководства pcrepattern ).