Sed substituir entre 2 cordas com caráter 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>

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

<PackingList#">

enquanto deveria ser

<PackingList>

O que estou fazendo de errado?

Respostas:


2

Três coisas erradas:

  • A primeira citação no sedcomando deve ser antes da s/opção, não antes de sedsi - presumo que seja um erro de digitação.
  • O >caracter não tem um significado especial em expressões regulares e não deve ser ignorado - a sequência \>tem um significado especial: significa o fim da palavra e, por .*ser "gananciosa", corresponde ao final da última palavra na linha, daí a retenção de o #".
  • Se você corresponder à fonte >, ela será incluída na string a ser substituída, portanto, ela também deve aparecer na string de substituição.

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

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

Isso é semelhante à solução de 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á-la mais legível), use:

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

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

sed 's/PackingList[^>]*"[^>]*"/PackingList/g' xmlfile

1

Tente assim:

sed 's/PackingList.*/PackingList>/g' xmlfile
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.