Mon exemple de chaîne est la suivante:
This is 02G05 a test string 20-Jul-2012
Maintenant, 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 string 20-Jul-2012" | sed -n '/\d+G\d+/p'
Mais la commande ci-dessus n’imprime rien et la raison, selon moi, n’est pas en mesure de faire correspondre le modèle que j’ai fourni à sed.
Donc, ma question est: qu'est-ce que je fais mal ici et comment la corriger?.
Lorsque j'essaie la chaîne et le modèle ci-dessus avec python, je reçois mon résultat.
>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>
Le modèle \d
pourrait ne pas être pris en charge par votre sed
. Essayez [0-9]
ou [[:digit:]]
à la place.
Pour imprimer uniquement la correspondance réelle (et non la ligne correspondante entière), 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 string 20-Jul-2012" | egrep -o '[0-9]+G[0-9]+'
sed
ne reconnaît pas \d
, utilisez plutôt [[:digit:]]
. Vous devrez également vous échapper du +
ou utiliser le commutateur -r
(-E
sous OS X).
Notez que [0-9]
fonctionne également pour les chiffres arabe-hindou.
Essayez ceci à la place:
echo "This is 02G05 a test string 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*/\1/'
Mais notez que s'il y a deux motifs sur une ligne, le second sera imprimé.
Essayez d’utiliser rextract . Il vous permettra d'extraire du texte à l'aide d'une expression régulière et de le reformater.
Exemple:
$ echo "This is 02G05 a test string 20-Jul-2012" | ./rextract '([\d]+G[\d]+)' '${1}'
2G05