Mon exemple de chaîne est le suivant:
This is 02G05 a test string 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 string 20-Jul-2012" | sed -n '/\d+G\d+/p'
Mais la commande ci-dessus n'imprime rien et la raison pour laquelle je pense est qu'elle n'est pas capable de faire correspondre quoi que ce soit avec le modèle que j'ai fourni à sed.
Donc, ma question est de savoir ce que je fais de mal ici et comment y remédier.
Quand j'essaye la chaîne et le modèle ci-dessus avec python, j'obtiens mon résultat
>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>
sed
. Leurs saveurs regex sont assez différentes.Réponses:
Le modèle
\d
n'est peut-être pas pris en charge par votresed
. Essayez[0-9]
ou à la[[:digit:]]
place.Pour imprimer uniquement la correspondance réelle (et non la ligne de correspondance entière), utilisez une substitution.
la source
.*
est nécessaire avec votre regex parce que quand j'essaye,sed -n 's/\([0-9]\+G[0-9]\+\)/\1/p'
il imprime juste la ligne entière.2G05
pas seulement02G05
. L'expression qui fonctionne est's/.*\([0-9][0-9]G[0-9][0-9]*\).*/\1/p'
sed -n 's/\(.*[^0-9]\)\?\([0-9][0-9]*G[0-9][0-9]*\).*/\2/p'
serait plus général. (Je suppose que vossed
supports\?
pour zéro ou un événement.)\w
,\s
, etc.Que diriez-vous d'utiliser
grep -E
?la source
sed
script complexe pourrait être conçu pour ce cas, mais pourquoi s'embêter?egrep
utilise une expression régulière étendue,sed
etgrep
utilise une expression régulière standard,egrep
ougrep -e
oused -E
utilise une expression régulière étendue, et le code python dans la question utilise PCRE, (expression régulière commune perl) GNU grep peut utiliser PCRE avec l'-P
option.egrep
ougrep -E
oused -r
grep
doit-m 1
s'arrêter après le premier match.sed
ne reconnaît pas\d
, utilisez à la[[:digit:]]
place. Vous devrez également échapper+
ou utiliser le-r
commutateur (-E
sous OS X).Notez que cela
[0-9]
fonctionne également pour les chiffres arabes-hindous.la source
sed -n '/[0-9]\+G[0-9]\+/p'
. Maintenant, il imprime juste la chaîne entièreEssayez plutôt ceci:
Mais notez que s'il y a deux motifs sur une ligne, il imprime le 2ème.
la source
Essayez d'utiliser rextract . Il vous permettra d'extraire du texte à l'aide d'une expression régulière et de le reformater.
Exemple:
la source
\d
sont complètement superflus.