J'ai donc une ligne:
ID: 54376
Pouvez-vous m'aider à créer une expression régulière qui ne renverrait que des chiffres sans "ID:"?
REMARQUE: cette chaîne se trouve dans un fichier.
text-processing
regular-expression
Blake Gibbs
la source
la source
-o
et-P
sont des extensions GNU pourgrep
.-o
fonctionne également sur les BSD. La prise en charge de PCRE avec-P
n'est pas toujours compilée non plus.Utilisez
egrep
avec-o
ougrep
avec l'-Eo
option pour obtenir uniquement le segment correspondant. Utilisez[0-9]
comme expression régulière pour obtenir uniquement des nombres:la source
Il y a plusieurs façons de procéder. Par exemple:
Utilisez GNU
grep
avec des PCRE récents et faites correspondre les nombres aprèsID:
:Utilisez
awk
et imprimez simplement le dernier champ de toutes les lignes commençant parID:
Cela imprimera également les champs qui ne sont pas des nombres, pour obtenir des nombres uniquement et uniquement dans le deuxième champ, utilisez
Utilisez GNU grep avec les expressions régulières étendues et analysez-le deux fois:
la source
\K
fait-on dans le premier exemple?-o
de n'imprimer que la partie correspondante mais aussi de jeter les choses qui ne m'intéressent pas. Comparerecho "foobar" | grep -oP "foobar"
etecho "foobar" | grep -oP 'foo\Kbar'
Cela n'imprimera que tous les nombres et espaces survenant après
ID: 54376
dans n'importe quelle entrée de fichier.Je viens de mettre à jour ce qui précède un peu pour le rendre un peu plus rapide avec
*
et pour ne pasp
imprimer de lignes vides après avoir supprimé les caractères non {numériques, espace}.Il aborde des lignes de regex à
/ID: 54376/
,
travers la$
dernière et less///
supprime tous ou les*
caractères^
ne[^ 0-9]*
puisp
rints/
une/
ligne avec un.
caractère restant.DÉMO:
PRODUCTION:
la source
Utilisation de sed:
La valeur
-n
"n'imprime rien par défaut", la valeur/^ID: [0-9][0-9]*$/
"pour les lignes correspondant à cette expression régulière" (commence par "ID:", puis 1 ou plusieurs chiffres, puis la fin de la ligne), ets/ID: //p
la forme ests/pattern/repl/flags
-s
signifie que nous fais un substitut, pour remplacer le motif"ID: "
par du texte de remplacement""
(chaîne vide) en utilisant lep
drapeau, ce qui signifie "imprimer cette ligne après avoir fait la substitution".Production:
la source
Une autre commande GNU sed,
Il imprime n'importe quel nombre après
ID:
la source
+
. Si la différence entre un caractère et 3 caractères est votre script ne fonctionne pas dans tous lessed
s vous devriez probablement faire:sed -n '/ID: \([0-9][0-9]*\).*/{s//\1/;s/.*[^0-9]//;/./p}'
. Votre réponse manque également la premièreID: [0-9]
d'une ligne contenant deux occurrences deID: [0-9]
.Utilisez grep + awk:
Bonus: facile à lire :)
la source
grep
si vous utilisezawk
.awk '/^ID/ { print $2 }'
fait la même chose et évite les problèmes de mise en mémoire tampon des lignes grep . C'est aussi à peu près la même chose que l'une des solutions dans la réponse de @ terdon.