J’ai un fichier XML, le fichier est composé d’une ligne.
Ce que j’essaie de faire, c’est d’extraire la valeur d’atsortingbut ” finalNumber
” du fichier via Putty. Plutôt que de devoir télécharger une copie et rechercher avec notepad ++.
J’ai construit une expression régulière que j’ai testée sur un outil en ligne et j’ai essayé de l’utiliser dans une commande sed
pour dupliquer les fonctionnalités de grep . La commande s’exécute mais ne renvoie rien.
RegEx:
(?<=finalNumber=")(.*?)(?=")
commande sed
(ne renvoie rien, prévu 28, voir extrait de fichier):
sed -n '/(?<=finalNumber=")(.*?)(?=")/p' file.xml
Extrait de fichier:
...argo:finalizedDate="2012-02-09T00:00:00.000Z" argo:finalNumber="28" argo:revenueMonth=""...
J’ai l’impression d’être proche (je peux me tromper), suis-je sur la bonne voie ou y a-t-il une meilleure façon de réaliser le résultat?
Rien de mal avec le bon vieux grep ici.
grep -E -o 'finalNumber="[0-9]+"' file.xml | grep -E -o '[0-9]+'
Utilisez -E
pour les expressions régulières étendues et -o
pour imprimer uniquement la partie correspondante.
Bien que vous ayez déjà sélectionné une réponse, voici un moyen de le faire dans pure sed:
sed -n 's/^.*finalNumber="\([[:digit:]]\+\)".*$/\1/p'
Sortie:
28
Cela remplace la ligne entière par le numéro de correspondance et l'impression (parce que p imprimera la ligne entière de sorte que vous devez remplacer la ligne entière)
Cela pourrait fonctionner pour vous (GNU sed):
sed -r 's/.*finalNumber="([^"]*)".*/\1/' file
sed
ne supporte pas les assertions prospectives. Perl fait cependant:
perl -ne 'print $1 if /(?<=finalNumber=")(.*?)(?=")/'
Si je comprends bien, il n’est pas nécessaire d’utiliser les outlook. Essaye celui-là
sed -n '/finalNumber="[[:digit:]]\+"/p'