Imprimer les correspondances RegEx à l’aide de SED dans bash

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'