usando Sed para pesquisar e substituir o texto no arquivo XML

5

Eu tenho o seguinte texto em File.XML :

<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->

Eu gostaria de substituir isso por

<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>

Eu tentei:

$ sed -i 's/<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->/<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>/' File.XML

Mas consiga este erro:

sed: -e expression #1, char 63: unknown option to 's'
    
por Shanker 01.04.2014 / 18:01

1 resposta

10

A questão é que o seu padrão de pesquisa contém / que você está usando como o delimitador de substituição, você precisa usar outro caractere para isso ou escapar do / :

sed -i 's#<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->#<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>#' File.XML

ou

sed -i 's/<!--UpdateAccountGUIDs>UpdateAndExit<\/UpdateAccountGUIDs-->/<UpdateAccountGUIDs>UpdateAndExit<\/UpdateAccountGUIDs>/' File.XML

Note que você deve nunca usar expressões regulares para analisar [X] HTML .

Por fim, como regra geral, ao trabalhar com expressões regulares, menos é mais. Você deve tentar especificar o padrão exclusivo mais simples possível em vez de repetir todo o texto. Isso não só torna seu código muito mais fácil de ler, mas também evita problemas como o que você estava enfrentando. Por exemplo:

sed -i -r 's/<!--(UpdateAccountGUIDs.+?)-->/<>/' File.XML

Aqui, o -r habilita a sintaxe da expressão regular estendida para que possamos usar () para capturar um grupo (sem a necessidade de escapar dos parênteses) e, em seguida, fazer referência ao texto capturado como . Assim, o comando acima simplesmente procura por um comentário que seja adjacente a UpdateAccountGUIDs , estende até o primeiro final da declaração de comentário e, em seguida, faz a substituição.

    
por terdon 01.04.2014 / 18:14