Sed extrait tous les matches de la même ligne


0

J'ai la ligne suivante:

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

Je ne peux pas faire sed pour extraire les valeurs entre les balises <News:Image>et </News:Image>.

J'ai essayé avec sed -rn 's/<News:Image>/<\/News:Image>/p' feed2.xmlet je ne pouvais pas le faire fonctionner.

J'ai besoin de sed pour sortir:

111

abc123

321abc

Réponses:


0

Votre sedchaîne change <News:Image>en </News:Image>, ce qui n'est pas ce que vous voulez.

Si nous supposons qu'aucun des textes ne contient <alors ce qui suit est une substitution simple et directe:

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

Ceci trouve n'importe quel texte avant et après la balise souhaitée, puis remplace la chaîne trouvée par ce qui se trouve entre les balises d'ouverture et de fermeture, avec une nouvelle ligne ajoutée.

Dans le cas plus général, par exemple s'il peut y avoir différentes étiquettes sur la même ligne, cela se fait très facilement avec deux sedappels:

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

La première passe isole les balises sur des lignes séparées en ajoutant de nouvelles lignes avant et après, puis la seconde extrait extrait ce qui se trouve entre les balises d'ouverture et de fermeture.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.