Comment extraire du texte d’une chaîne en utilisant sed?

Mon exemple de chaîne est le suivant:

This is 02G05 a test ssortingng 20-Jul-2012 

Maintenant, à partir de la chaîne ci-dessus, je veux extraire 02G05 . Pour cela j’ai essayé la regex suivante avec sed

 $ echo "This is 02G05 a test ssortingng 20-Jul-2012" | sed -n '/\d+G\d+/p' 

Mais la commande ci-dessus n’imprime rien et la raison pour laquelle je pense que cela ne correspond pas au motif que j’ai fourni à sed.

Donc, ma question est ce que je fais mal ici et comment le corriger.

Quand j’essaie la chaîne et le motif ci-dessus avec python, j’obtiens mon résultat

 >>> re.findall(r'\d+G\d+',st) ['02G05'] >>> 

Le pattern \d peut ne pas être supporté par votre sed . Essayez plutôt [0-9] ou [[:digit:]] .

Pour imprimer uniquement la correspondance réelle (et non la totalité de la ligne correspondante), utilisez une substitution.

 sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p' 

Que diriez-vous d’utiliser egrep ?

 echo "This is 02G05 a test ssortingng 20-Jul-2012" | egrep -o '[0-9]+G[0-9]+' 

sed ne reconnaît pas \d , utilisez plutôt [[:digit:]] . Vous devrez également échapper le + ou utiliser le commutateur -r ( -E sur OS X).

Notez que [0-9] fonctionne aussi bien pour les chiffres arabe-hindou.

Essayez plutôt ceci:

 echo "This is 02G05 a test ssortingng 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*/\1/' 

Mais notez que s’il y a deux motifs sur une ligne, celle-ci imprime le 2ème.

Essayez d’utiliser rextract . Il vous permettra d’extraire du texte en utilisant une expression régulière et de le reformater.

Exemple:

 $ echo "This is 02G05 a test ssortingng 20-Jul-2012" | ./rextract '([\d]+G[\d]+)' '${1}' 2G05