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