Usando bash para substituir entidades de caracteres html no arquivo xml

0

Eu tenho uma string como essa no arquivo xml:

&lt;h3&gt;Styled here with: &lt;a href="$url('Product-Show','pid','107723102')$"&gt;FRS blo&lt;/a&gt;, &lt;a href="$url('Product-Show','pid','000482512')$"&gt;Os Cutes&lt;/a&gt;&amp;nbsp;and &lt;a href="$url('Product-Show','pid','000312901')$"&gt;Dor Sho&lt;/a&gt;&lt;/p&gt;</short-description>

Eu preciso substituir /p&gt part por /h3&gt .

Eu tentei fazer isso com a ajuda de sed , como abaixo:

sed -i -e 's/&lt;h3&gt;Styled here with\:.*\/p&gt;/&lt;h3&gt;Styled here with\:.*\/h3&gt;/g' new_exp_dev02.xml

mas isso não funcionou e apenas dobrou o resultado.

Talvez eu tenha esquecido de escapar de mais alguns símbolos para substituir /p&gt part por /h3&gt corretamente?

    
por fuser 11.10.2018 / 18:47

2 respostas

2

sed pode usar quase qualquer caractere como um delimitador para sua expressão, achei melhor não usar um delimitador que esteja na cadeia de caracteres que está tentando substituir para limitar erros de escape.

sed -e 's!/p&gt!/h3\&gt!g' new_exp_dev02.xml substitui /p&gt por /h3&gt . O e comercial ( & ) na substituição precisa ser escapado, pois esse caractere tem um significado especial nas expressões de substituição sed .

Sua expressão sed postada é muito difícil de ser lida e não tenho certeza do que você está tentando alcançar com ela, mas parece que ela tem uma meta diferente, então "substitua /p&gt part por /h3&gt ."

EDIT: se você tiver que escrever a expressão nesse formato longo, isso deve funcionar:

sed -e 's!\(&lt;h3&gt;Styled here with:.*\)/p&gt;!/h3\&gt;!g' new_exp_dev02.xml

Isso coloca a parte combinada inteira além de /p&gt em uma referência anterior, que podemos usar na seção de substituição como . Você não pode usar a expressão regular no lado de substituição de uma substituição sed , já que as expressões regulares são usadas apenas para correspondência.

A primeira expressão nesta resposta substituirá todas as ocorrências de /p&gt com /h3&gt , a segunda expressão só substituirá /p&gt se ocorrer imediatamente após corresponder à expressão regular "&lt;h3&gt;Styled here with:.*"

    
por 11.10.2018 / 22:14
0

Você pode tentar com o comando abaixo perl

 perl -pne "s/p&gt/h3&gt/g" filename

saída

&lt;h3&gt;Styled here with: &lt;a href="$url('Product-Show','pid','107723102')$"&gt;FRS blo&lt;/a&gt;, &lt;a href="$url('Product-Show','pid','000482512')$"&gt;Os Cutes&lt;/a&gt;&amp;nbsp;and &lt;a href="$url('Product-Show','pid','000312901')$"&gt;Dor Sho&lt;/a&gt;&lt;/h3&gt;</short-description>
    
por 12.10.2018 / 15:12

Tags