Como remover o caractere de nova linha entre duas fontes \ n / font em unix?

0

Eu quero remover a nova linha entre duas tags html que existem da seguinte forma:

<font>
</font>

Desejo remover o caractere de nova linha de modo que ele se torne:

<font></font>

Além disso, pode haver casos em que haja mais de uma nova linha (s):

<font>

</font>

Isso também quero remover para que pareça:

<font></font>

Mais um cenário,

se o padrão for assim:

<font>
This is a text
</font>

Depois, a conversão deve se tornar:

<font>This is a text</font>

Todos os cenários acima são resolvidos, se apenas truncarmos somente a nova linha entre duas tags html. Não devemos considerar nenhum espaço em branco.

Existem algumas maneiras que eu encontrei usando sed, mas é muito demorado e muito muito eficiente desempenho sábio, especialmente se o arquivo tiver 1000 + tags html.

    
por Ronit Mishra 04.09.2016 / 18:53

2 respostas

2

Este comando sed deve ajudá-lo:

sed -e ':1;/<font>[[:space:]]*$/{N;s#<font>[[:space:]]\+</font>#<font></font>#g;b1}' file

O comando está procurando pela tag <font> que é seguida pelos espaços em branco até o final da linha. Então a próxima linha é puxada para dentro do espaço padrão; em seguida, a substituição de uma sequência possivelmente existente <font>[[:space:]]\+</font> é executada e o script é reiniciado desde o início. Se o espaço padrão não corresponder ao endereço /<font>[[:space:]]*$/ , ou seja, algum conteúdo não espacial estará presente após uma tag <font> , o espaço padrão será impresso e limpo pelo end of sed script e o processo será reiniciado.

Editar : Medição de desempenho.

Eu preenchi um arquivo com o seguinte conteúdo repetido 10k vezes:

<font>
dejidewji
</font>
<font>



</font><font>





</font>

totalmente, 620Kb. Os tempos do script acima em 1.4Gz A8-4500M são:

real    0m0.361s
user    0m0.356s
sys 0m0.005s

Edit2 :

A sua última pergunta é muito mais fácil de resolver por perl e o desempenho é 10 vezes melhor, como mostrou a outra resposta:

perl -0777 -pe 's|<font>\s+|<font>|g;s|\s+</font>|</font>|g' file

Créditos para @spasic

    
por 04.09.2016 / 19:27
1
$ cat ip.html
<font>
This is a text
</font>

123

<font>
</font>

xyz

<font>

</font>

ijk

<font>





</font>

789

perl solution, -0777 faz slurps no arquivo inteiro

$ perl -0777 -pe 's|<font>\n*([^\n]*)\n*</font>|<font>$1</font>|g' ip.html
<font>This is a text</font>

123

<font></font>

xyz

<font></font>

ijk

<font></font>

789
    
por 05.09.2016 / 03:55