Это должно работать хорошо. Он использует манипуляции со строками, а не регулярные выражения. Следует также учитывать случай, когда открывающий и закрывающий теги P находятся на одной строке.
awk '
!in_p && idx = index($0,"<p>") {
in_p = 1
$0 = substr($0,idx+4)
}
in_p && idx = index($0, "</p>") {
seen_close = 1
$0 = substr($0,0,idx-1)
}
in_p {print}
seen_close {exit}
' file.html
Не будет работать, как ожидалось, если вы вложили абзацы, как
<p>
Hi. Lorem Ipsum<br />
dolor si amet […]
<p>
…
</p>
</p>
<p>2nd paragraph</p>
XML/HTML очень сложно анализировать вручную: используйте анализатор HTML.