Si vous avez la possibilité grep -A
mentionné dans la réponse ci-dessus, et la commande Unix tr
sur votre système, vous pouvez faire quelque chose de raisonnablement robuste.
Cette commande doit obtenir la valeur appropriée:
grep -A2 '<e2ber>' one.xml | \
tr -d '\n' | \
sed -n -E -e 's/.*<e2ber>[[:blank:]]*([0-9][0-9]*)[[:blank:]]*<\/e2ber>.*/\1/p'
Cela devrait fonctionner si le fichier XML est formaté comme <e2ber>0</e2ber>
ou
<e2ber>
0
</e2ber>
Le grep attraper suffisamment de lignes pour inclure la fermeture tag, le tr fera une longue ligne, et le sed va extraire la valeur. J'ai mis à jour l'expression régulière dans le sed pour ignorer les espaces autour de la valeur.
Cela peut toujours poser problème si le fichier XML est à double interligne, par exemple.
<e2ber>
0
</e2ber>
Vous pouvez contourner ce problème en exécutant le fichier XML à travers tr -s '\n'
au préalable. Cela permettra de compacter plusieurs nouvelles lignes en une seule nouvelle ligne.
Ça ne marche pas parce que vous avez des sauts de ligne là-bas ... ce sera faisable avec sed ou awk, j'en suis sûr, mais serait probablement plus heureux en perl ... avez-vous cette disponibilité? – Cascabel
Le problème est que sed applique des expressions régulières à une ligne à la fois. Puisque les et sont sur des lignes différentes, ils ne correspondent pas à l'expression. Pouvez-vous changer le format de fichier pour quelque chose comme ? Ensuite, vous pourriez être en mesure d'identifier la ligne plus facilement. –
L'autre question que nous devrions poser est votre condition exacte. Je comprends que vous avez des ressources limitées, donc vous n'allez pas analyser complètement le XML, donc votre robustesse sera limitée. Vous pouvez au moins compter sur le fichier XML ne faisant rien de trop fou, j'espère. – Cascabel