grep é explicitamente definido para ignorar novas linhas, então você não pode realmente Use isso. sed sabe internamente se a linha atual (fragmento) termina em uma nova linha ou não, mas não consigo ver como ela pode ser coagida para revelar essa informação. awk separa os registros por novas linhas ( RS ), mas realmente não se importa se havia um, a ação padrão de print é imprimir uma nova linha ( ORS ) no final em qualquer caso.
Portanto, as ferramentas usuais não parecem muito úteis aqui.
No entanto, sed sabe quando está trabalhando na última linha, por isso, se você não se importar em perder a última linha intacta nos casos em que uma parcial não é vista, você pode ter apenas sed delete pensa que é o último. Por exemplo,
sed -n -e '$d' -e '/pattern/p' < somefile # or
< somefile sed '$d' | grep ...
Se isso não for uma opção, então sempre haverá Perl. Isso deve imprimir apenas as linhas que correspondem a /pattern/ e ter uma nova linha no final:
perl -ne 'print if /pattern/ && /\n$/'