Ao modificar arquivos XML, sed
realmente não é a melhor escolha, pois não tem idéia de que há estrutura no arquivo que está sendo editado e ficará feliz em transformar um documento bem-formado em um mush mal formado. Em vez disso, você deve usar uma ferramenta com reconhecimento de XML: utilizarei xsltproc
e XSLT, mas um utilitário XML grep provavelmente também executaria o trabalho.
Primeiro, faça uma folha de estilo de transformação de identidade que substitui o antigo valor do atributo select
pelo novo:
replace.xslt
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@select[contains(.,'/ns1:Invoice/cac:AccountingSupplierParty/cbc:CustomerAssignedAccountID')]">
<xsl:attribute name="select">
<xsl:value-of select="'/ns1:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID'"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Em seguida, execute xsltproc
no arquivo a ser convertido:
xsltproc replace.xslt /path/to/inputfile.xml > /path/to/convertedfile.xml
Como de costume, confirme que a transformação está fazendo a coisa certa; Saí do que você forneceu, para que outras alterações sejam necessárias para uma conversão completa.