Considere este arquivo de amostra:
$ cat sample.html
<li a=x>Point One
</li>
<li>Point Two
</li>
Eu acredito que este comando sed faz o que você pede (isso pode exigir o GNU sed):
$ sed -Ez 's|<li\b|\t<li|g; s|\n</li\b|</li|g' sample.html
<li a=x>Point One</li>
<li>Point Two</li>
Como funciona
-
-EUse regex estendido.
-
-zLer dados delimitados por nul. Como um arquivo html adequado não possui caracteres nulos, isso tem o efeito de ler todo o arquivo de uma só vez.
-
s|<li\b|\t<li|gIsso coloca uma guia na frente de cada ocorrência de
<liseguido por um limite de palavras. -
s|\n</li\b|</li|gIsso substitui todas as ocorrências de nova linha seguidas por
<liseguido por um limite de palavra com<li.
Uma variação: colocando <li> em sua própria linha
$ sed -Ez 's|<li[^>]*>|&\n|g; s|\n</li\b|</li|g' sample.html
<li a=x>
Point One</li>
<li>
Point Two</li>
Aviso obrigatório
O html pode ser complexo e esses comandos sed destinam-se apenas a trabalhar em casos simples.