Sed substituir entre 2 cordas com caractere especial

3

Eu tenho um arquivo XML contendo um código e para usá-lo com xmllink eu preciso remover um link.

Arquivo XML contendo:

<xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PackingList xmlns="Link to somewhere#">
<morecode></morecode>

Usar o sed 'sed s/PackingList.*\>/PackingList/g' xmlfile me dá o seguinte resultado (na segunda linha):

<PackingList#">

enquanto deveria ser

<PackingList>

O que estou fazendo de errado?

    
por Rocketman 02.12.2014 / 16:51

2 respostas

2

Três coisas erradas: -

  • A primeira cotação no comando sed deve estar antes da opção s/ , e não antes do sed - presumo que seja um erro de digitação.
  • O caractere > não tem significado especial em expressões regulares e não deve ter escape. A sequência \> tem significado especial: significa fim da palavra e porque .* é "ganancioso" corresponde ao final da última palavra na linha, daí a retenção do #" .
  • Se você corresponder à origem > , isso será incluído na sequência a ser substituída, portanto, ela também deve aparecer na string de substituição.

Então, seu comando de edição deve ser:

sed 's/PackingList.*>/PackingList>/g' xmlfile

Isso é semelhante à solução do jherran, mas leva em conta sua tentativa original de correspondência. Pode ser melhor combinar com a aspa dupla:

sed 's/PackingList.*"/PackingList/g' xmlfile

Se você não quiser confiar na ganância (e torná-lo mais legível), use:

sed 's/PackingList.*".*"/PackingList/g' xmlfile

Observe que qualquer tag XML subsequente na mesma linha pode ser excluída por qualquer um dos itens acima: para evitar isso, use:

sed 's/PackingList[^>]*"[^>]*"/PackingList/g' xmlfile
    
por 02.12.2014 / 18:19
1

Tente desta maneira:

sed 's/PackingList.*/PackingList>/g' xmlfile
    
por 02.12.2014 / 17:02