Substituir os valores da entidade XML por lookaround positivo

1

Estou tentando fazer alguns sed ding simples de um arquivo:

sed 's:(?<=<Type>)default(?=</Type>):super:' < myfile.xml

O conceito é bem simples, usando uma abordagem positiva, encontre as tags e substitua o conteúdo por "super". Infelizmente, isso não funciona, nada é substituído. O que estou fazendo de errado?

Estou procurando "editar" um arquivo semelhante a este:

<Hello>
    <World>
        <Type>default</Type>
    </World>
</Hello>

para que fique assim:

<Hello>
    <World>
        <Type>super</Type>
    </World>
</Hello>
    
por Naftuli Kay 10.11.2011 / 08:50

3 respostas

2

Sua expressão regular está correta, mas sed não lida com lookarounds. Seu código funciona bem com perl :

perl -pe 's:(?<=<Type>)default(?=</Type>):super:' your.file

Como as expressões regulares geralmente não são muito boas no tratamento de XML, sugiro tentar XMLStarlet :

xml ed -O -u '//Type' -v 'super' your.file

Tanto o perl quanto o xml também podem fazer a edição no local, portanto, não há dor substituindo sed .

    
por 10.11.2011 / 10:02
1

Você está tentando usar a sintaxe de expressão regular Perl no sed; isso não vai funcionar. Sed usa expressões regulares básicas ; O Perl usa expressões regulares estendidas com mais recursos . Lookaround é um dos recursos específicos do Perl; é encontrado em outras implementações modernas de regexp, mas não em sed.

Você não precisa procurar aqui. O lookaround positivo no início ou no final de um padrão que você está substituindo pode ser facilmente transformado em um texto de substituição variável. Consulte também Somente para retorno a parte de uma linha depois de um padrão de correspondência para mais exemplos e explicações.

sed 's:\(<Type>\)default\(</Type>\):super:'

Aqui, como o look-behind e o look-ahead são constantes, você pode até fazer uma substituição simples de string.

sed 's:<Type>default</Type>:<Type>super</Type>:'
    
por 11.11.2011 / 00:42
0

Eu realmente não entendo claramente quais partes da entrada são variáveis e quais são constantes. Supondo que Type seja variável e default , super sejam constantes, você pode usar o seguinte script sed

s:<\([^>]\+\)>default</>:<>super</>:
    
por 10.11.2011 / 09:40