Sed extrair todas as correspondências na mesma linha

0

Eu tenho a seguinte linha:

randomtext<News:Image>111</News:Image>morerandomtext<News:Image>abc123</News:Image>sometext<News:Image>321abc</News:Image>

Não consigo fazer sed para extrair os valores entre as tags <News:Image> e </News:Image> .

Eu tentei com sed -rn 's/<News:Image>/<\/News:Image>/p' feed2.xml e não consegui fazer isso funcionar.

Eu preciso do sed para a saída:

111

abc123

321abc

    
por marcio 24.11.2017 / 19:47

1 resposta

0

Sua string sed altera <News:Image> para </News:Image> , o que você não deseja.

Se assumirmos que nenhum dos textos contém < , o seguinte é uma substituição simples e direta:

sed -n 's/[^<]*<News:Image>\([^<]*\)<\/News:Image>[^<]*/\n/gp' feed2.xml

Ele encontra qualquer texto antes e depois da tag desejada e substitui a string encontrada pelo que fica entre as tags de abertura e de fechamento, com uma nova linha anexada.

No caso mais geral, por exemplo, onde pode haver tags diferentes na mesma linha, isso é mais fácil com duas sed chamadas:

sed -e 's/<News:Image>/\n&/g' -e 's/<\/News:Image>/&\n/g' feed2.xml | \
    sed -n 's/[^<]*<News:Image>\(.*\)<\/News:Image>//gp'

O primeiro passo isola as tags em linhas separadas, adicionando novas linhas antes e depois, depois a segunda passagem extrai o que está entre as tags de abertura e de fechamento.

    
por 24.11.2017 / 20:44

Tags