J'ai une chaîne du format [0-9]+\.[0-9]+\.[0-9]
. J'ai besoin d'extraire les premier, deuxième et troisième nombres séparément. Si je comprends bien, les groupes de capture devraient être capables de cela. Je devrais pouvoir utiliser sed "s/\([0-9]*\)/\1/g
pour obtenir le premier numéro, sed "s/\([0-9]*\)/\2/g
pour obtenir le deuxième numéro et sed "s/\([0-9]*\)/\3/g
pour obtenir le troisième numéro. Dans chaque cas, cependant, j'obtiens la chaîne entière. Pourquoi cela arrive-t-il?
27
's/\([0-9]\)\([0-9]\)\([0-9]\).*/\1\2\3/'
pour capturer des numéros individuels.Réponses:
Nous ne pouvons pas vous donner une réponse complète sans un exemple de votre contribution, mais je peux vous dire que votre compréhension des groupes de capture est erronée. Vous ne les utilisez pas séquentiellement, ils se réfèrent uniquement à l'expression régulière sur le côté gauche du même opérateur de substitution. Si vous capturez, par exemple,
/(foo)(bar)(baz)/
alorsfoo
sera\1
,bar
sera\2
etbaz
sera\3
. Vous ne pouvez pas faires/(foo)/\1/; s/(bar)/\2/
, car, dans le deuxièmes///
appel, il n'y a qu'un seul groupe capturé, donc\2
ne sera pas défini.Donc, pour capturer vos trois groupes de chiffres, vous devez faire:
Ou, le plus lisible:
la source
/(foo)/
dans sed correspondra à un(
caractère littéral , suivi defoo
puis d'un littéral)
. Si vous souhaitez capturer un groupe, vous devez soit échapper les parenthèses, soit utiliser l'-E
option.-r
drapeau, donc je suppose que c'est pourquoi je ne l'ai pas encore rencontré.-r
drapeau fera aussi cela, mais il n'est pas portable. GNU sed le supporte mais beaucoup d'autres non. Le-E
est plus universel.Exemple:
Ou, tous ensemble:
la source
Utilisez Sed avec -r, --regexp-extended pour éviter toutes les parenthèses échappées.
la source