web-dev-qa-db-fra.com

Comment extraire le texte d'une chaîne en utilisant sed?

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']
>>>
69
RanRag

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'
65
tripleee

Que diriez-vous d'utiliser egrep?

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

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.

4
Dennis Williamson

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é.

4
Zsolt Botykai

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
0
Tim Savannah