Usando sed para extrair texto entre 2 tags

14

Eu tenho um arquivo .xml e estou tentando fazer um "groupinstall" em uma máquina RHEL6, pois há várias centenas de bibliotecas nesse arquivo .xml ... (perto de 16 000 linhas).

Por isso, estou tentando extrair os nomes de grupos contidos no arquivo .xml que possui essa estrutura:

<b>
<group>
<id> group name </id>
   <packages>
   ...
   </packages>
<id> group name 2 </id>
   <packages>
   ...
   </packages>
<id> etc... </id>
</group>
</b>

Basicamente, é isso que eu tentei:

sed -n '/<id>/,/<\/id>/p' test1.txt > test2.txt

Eu copiei o arquivo .xml para test1.txt. Eu estou tentando extrair os nomes de grupo do test1.txt para um segundo arquivo chamado test2.txt. No entanto, com a linha acima, ele está extraindo tudo da tag FIRST <id> para a última tag </id> no meu arquivo. Como posso alterar meu código para extraí-lo várias vezes?

Minha segunda pergunta seria: o plugin -downloadonly funciona também com grupos para o yum?

    
por Guillaume F. 30.10.2013 / 17:26

5 respostas

25

Parece que o que você precisa é mais algo do tipo

sed -n 's:.*<id>\(.*\)</id>.*::p'

(assumindo como em sua amostra que <id> e </id> estão na mesma linha e que há apenas um <id>...</id> por linha).

Ou use uma ferramenta com reconhecimento de XML:

xmlstarlet sel -t -v '//id' -n
    
por 30.10.2013 / 17:36
2

Por favor, tente com

xml_grep 'id' file.xml --text_only
    
por 24.05.2016 / 12:32
1

Isto é XML, você deve usar um analisador XML. Aqui está uma solução usando o XMLStarlet :

$ xml sel -t -v '//group/id' -nl data.xml
 group name
 group name 2

A expressão XPath //group/id selecionará qualquer nó id abaixo de um nó group . O -t -v significa "use o seguinte modelo para extrair valores". O -nl no final garantirá que a saída seja finalizada com uma nova linha.

O exemplo acima usa um arquivo XML que é idêntico ao seu, mas com qualquer linha contendo ... removido.

    
por 25.01.2017 / 14:27
0
$ echo '<id>I am a sample group</id>' | sed 's/<\/\?[^>]\+>//g'
I am a sample group
$

Isso funcionará com qualquer tag , claro, também com <a href="...">...</a> anchors. Nenhum GNUisms usado - o suporte básico de regex em sed será suficiente.
No entanto : observe que as tags de abertura e fechamento devem estar na mesma linha, caso contrário, declaração teria que ser reescrito novamente.

    
por 28.07.2015 / 19:36
0

Eu li este post procurando resolver o problema de extrair o Reqd. Pacotes do DVD do RHEL 7.3 repos.xml , que eu acho que é exatamente o que o autor acima estava tentando fazer. Então eu espero que este script possa ajudar outra pessoa ... Eu usei isso muitas vezes agora.

Então eu precisava instalar o grupo "GNOME DESKTOP" no meu servidor RHEL7 "Minimal Install" que não tinha X / GUI configurado.

[root@rac01]# yum group list
Loaded plugins: ulninfo
There is no installed groups file.

Hmmmmm… nenhuma lista de grupo no DVD para o yum (sim, eu tentei o usual "google" consertar e nunca funcionou) então recorri a fonte hard da lista de xml.

  1. Monte o DVD.
  2. Encontre o arquivo XML com minha lista de pacotes necessária.
  3. Extraia a lista de grupos de pacotes.
  4. Percorra a lista de pacotes e instale (incl. dependências).
  5. Supondo que você tenha executado createrepo /your/local_rpms/dir .

    sudo su -
    mkdir /mnt/sr0
    mount /dev/sr0 /mnt/sr0
    cd /mnt/sr0
    
    FILE=$(find . -name "*.xml" | xargs grep '<id>gnome-desktop<\/id>'| cut -d: -f1)
    PKGLIST=$(sed -n '/<id>gnome-desktop<\/id>/,/<\/packagelist>/p' $FILE \
    | sed  -n  '/^ *<packagelist> *$/,/^ *<\/packagelist> *$/{/<packagereq type>/{d};p}' \
    | cut -d'>' -f2 \
    | cut -d'<' -f1)
    
    for p in ${PKGLIST}
       do
        yum deplist ${p}* | awk '/provider:/ {print $2}' | sort -u | xargs yum -y install
    done
    
por 26.11.2016 / 06:58

Tags