Если ваш SGML таков, что он может быть обработан как XML, то XProc - хорошая технология для такого рода вещей, с одним шагом, таким как:
<p:unwrap match="p[parent::p]"/>
(Предполагается, что вы хотите удалить все вложенные элементы p, пока p никогда не обернет себя).
Вы определенно не хотите обрабатывать SGML / XML с помощью регулярных выражений, если только вы не уверены на 100%, что будете иметь дело с подмножеством, которое имеет определенную четко определенную лексическую форму. Подумайте, например, как вы будете обрабатывать комментарии с помощью регулярного выражения:
<p><!-- <p> commented out--><foo><p/><p/></foo></p>
!!