Isso ocorre porque o padrão de correspondência .* é o que é conhecido como correspondência desejada , o que significa que ele retornará a sequência maior para corresponder ao seu padrão de pesquisa. / p>
O que você gostaria de fazer é usar uma correspondência não voraz (ou preguiçoso ), que retorna a string menor para corresponder seu padrão. Você pode fazer isso alterando sua correspondência desejada de .* para .*? . No entanto, grep normalmente não suporta isso por padrão, mas você pode habilitar isso usando a opção -P que permite a correspondência de expressão regular perl.
Em suma, você pode alterar seu comando grep para grep -o -P '(?<=<p>).*?(?=</p>)' .
Mais detalhes sobre essa resposta podem ser encontrados no link