Bash: Meilleur moyen d'obtenir toutes les correspondances de chaîne avec grep dans la chaîne [duplicate]
Nov 23 2020
J'ai du mal à trouver un moyen d'obtenir toutes les valeurs correspondantes de la chaîne. J'ai une chaîne XML stockée dans une variable. De cette variable, j'extrais une chaîne avec grep. Cela fonctionne bien pour une correspondance, mais comme grep ne renvoie que la première valeur correspondante, cela ne fonctionne pas exactement comme je le souhaite.
XML="..."
VALUE=($(grep -oP "<tag>(.*)</tag>" <<<"${XML}" | cut -d ">" -f 2 | cut -d "<" -f 1))
Y a-t-il un moyen meilleur / plus intelligent de résoudre ce problème que de trouver une valeur, de la remplacer dans une chaîne XML existante afin que ce ne soit plus une correspondance, puis de l'exécuter en boucle jusqu'à ce qu'aucune correspondance ne soit trouvée?
Exemple XML court:
<?xml version="1.0" encoding="UTF-8"?>
<xmlDoc>
<docName>...</docName>
<formats>
<format>
<name>a:1</name>
</format>
<format>
<name>b:2</name>
</format>
</formats>
</xmlDoc>
Réponses
1 etsuhisa Nov 23 2020 at 10:36
Divisez en plusieurs lignes et exécutez la commande grep.
VALUE="$(sed 's#</tag>#</tag>\n#g' <<<"${XML}" | grep -oP "<tag>(.*)</tag>" | cut -d ">" -f 2 | cut -d "<" -f 1)"