Como remover o conteúdo antes de um padrão no xml usando unix

0
Source file example:
<HDR></HDR><b></b><c></c>

(arquivo XML criado em uma única linha)

OR

Source file example:
<HDR>
</HDR>
<b>
</b>
<c>
</c>

Eu preciso remover todo o conteúdo do arquivo antes de <b> em ambos os formatos de origem. Eu tentei usar o método abaixo

sed 's/^.*b/b/'

Mas isso não está substituindo isso. Por favor, deixe-me saber se existe uma maneira alternativa.

    
por user7952074 03.09.2018 / 08:57

3 respostas

5

Supondo que seu documento XML esteja bem formado, como

<document>
<HDR>
</HDR>
<b>
</b>
<c>
</c>
</document>

Em seguida, você pode usar o XMLStarlet para remover todas as tags HDR da seguinte forma:

xmlstarlet ed -d '//HDR' file.xml >newfile.xml

Para remover apenas as tags HDR que são imediatamente seguidas por uma tag b :

xmlstarlet ed -d '//HDR[following-sibling::*[1][name() = "b"]]' file.xml >newfile.xml

XMLStarlet também pode ser usado para modificar o conteúdo das tags:

$ xmlstarlet ed -u '//HDR[following-sibling::*[1][name() = "b"]]' -v 'New header value' file.xml
<?xml version="1.0"?>
<document>
  <HDR>New header value</HDR>
  <b/>
  <c/>
</document>

$ xmlstarlet ed -i '//HDR[following-sibling::*[1][name() = "b"]]' -t attr -n 'new_attribute' -v 'hello' file.xml
<?xml version="1.0"?>
<document>
  <HDR new_attribute="hello"/>
  <b/>
  <c/>
</document>
    
por 03.09.2018 / 09:22
1

Tipo 1 :

 echo "<HDR></HDR><b></b><c></c>" | sed 's/^.*<b>/<b>/' 
 <b></b><c></c>
  • substituirá tudo em <b> por <b>

Tipo 2 :

sed  -n '/<b>/,$p' file
<b>
</b>
<c>
</c>
  • imprimirá a primeira ocorrência de <b> no final do arquivo ($).
por 03.09.2018 / 09:27
1

Pergunta:

remove all contents of the file before <b>

Resposta:

perl -0777 -lape 's/^.*<b>/<b>/s'

Execução de teste:

==> in1.txt <==
<HDR></HDR><b></b><c></c>

==> in2.txt <==
<HDR>
</HDR>
<b>
</b>
<c>
</c>

$ perl -i -0777 -lape 's/^.*<b>/<b>/s' in{1,2}.txt

==> in1.txt <==
<b></b><c></c>

==> in2.txt <==
<b>
</b>
<c>
</c>
    
por 03.09.2018 / 09:15