Adicionando / removendo algumas guias e quebras de linha em um código HTML usando sed

1

Eu quero refinar um código HTML usando sed, como um procedimento de refinamento extra depois de refiná-lo usando o HTML Tidy, já que o HTML Tidy não parece flexível o suficiente para alguns requisitos.

Eu usei este comando para adicionar algumas guias e / ou quebras de linha a algumas tags e removê-las de outras pessoas:

s/<li>/\t&/g
s/\n<\/li>/<\/li>/g
  1. O primeiro comando funcionou bem, a menos que li tenha um atributo, portanto, como posso segmentar uma tag de abertura independentemente de ter ou não um atributo?
  2. O segundo comando não funcionou. Quero aqui colocar a tag de fechamento </li> no final da linha anterior.
por Anas R. 25.05.2016 / 19:58

1 resposta

0

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

  • -E

    Use regex estendido.

  • -z

    Ler 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|g

    Isso coloca uma guia na frente de cada ocorrência de <li seguido por um limite de palavras.

  • s|\n</li\b|</li|g

    Isso substitui todas as ocorrências de nova linha seguidas por <li seguido 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.

    
por 26.05.2016 / 02:56