Existe-t-il un moyen de dire sed
de sortir uniquement les groupes capturés? Par exemple, étant donné l'entrée:
This is a sample 123 text and some 987 numbers
et motif:
/([\d]+)/
Puis-je obtenir uniquement une sortie 123 et 987 de la manière formatée par des références arrières?
sed
d'activer les expressions régulières étendues avec l'-E
indicateur.Réponses:
La clé pour que cela fonctionne est de dire
sed
d'exclure ce que vous ne voulez pas sortir et de spécifier ce que vous voulez.Cela dit:
-n
)p
)En général, dans
sed
vous capturez des groupes à l'aide de parenthèses et sortez ce que vous capturez à l'aide d'une référence arrière:affichera "bar". Si vous utilisez
-r
(-E
pour OS X) pour l'expression régulière étendue, vous n'avez pas besoin d'échapper aux parenthèses:Il peut y avoir jusqu'à 9 groupes de capture et leurs références arrières. Les références arrières sont numérotées dans l'ordre d'apparition des groupes, mais elles peuvent être utilisées dans n'importe quel ordre et peuvent être répétées:
affiche "une barre a".
Si vous avez GNU
grep
(il peut également fonctionner dans BSD, y compris OS X):ou des variations telles que:
L'
-P
option active les expressions régulières compatibles Perl. Voirman 3 pcrepattern
ouman 3 pcresyntax
.la source
sed
exemple, si vous utilisez l'-r
option (ou-E
pour OS X, IIRC), vous n'avez pas besoin d'échapper aux parenthèses. La différence est celle entre les expressions régulières de base et les expressions régulières étendues (-r
).Sed a jusqu'à neuf modèles mémorisés, mais vous devez utiliser des parenthèses d'échappement pour mémoriser des parties de l'expression régulière.
Voir ici pour des exemples et plus de détails
la source
sed -e 's/version=\(.+\)/\1/' input.txt
cela affichera toujours le fichier input.txt entier\+
au lieu de+
. Et je ne comprends pas pourquoi les gens utilisent-e
pour une seule commande sed.sed -e -n 's/version=\(.+\)/\1/p' input.txt
voir: mikeplate.com/2012/05/09/…sed -E
d'utiliser les expressions régulières dites "modernes" ou "étendues" qui ressemblent beaucoup plus à Perl / Java / JavaScript / Go / quelles que soient les saveurs. (Comparez avecgrep -E
ouegrep
.) La syntaxe par défaut a ces étranges règles d'échappement et est considérée comme "obsolète". Pour plus d'informations sur les différences entre les deux, exécutezman 7 re_format
.vous pouvez utiliser grep
la source
o
option est là - unixhelp.ed.ac.uk/CGI/man-cgi?grep : -o, --only-matching N'afficher que la partie d'une ligne correspondante qui correspond au MOTIFgrep -Eow -e "[0-9]+" -e "[abc]{2,3}"
je ne sais pas comment vous pourriez exiger que ces deux expressions soient sur une seule ligne en dehors de la tuyauterie d'un grep précédent (qui pourrait toujours ne pas fonctionner si l'un des motifs correspond plus d'une fois sur une ligne ).série (s) de chiffres
Cette réponse fonctionne avec n'importe quel nombre de groupes de chiffres. Exemple:
Réponse élargie.
Oui. remplacer tout le texte par le groupe de capture:
Ou avec une syntaxe étendue (moins de guillemets et autorise l'utilisation de +):
Pour éviter d'imprimer le texte d'origine lorsqu'il n'y a pas de numéro, utilisez:
Et pour faire correspondre plusieurs nombres (et aussi les imprimer):
Cela fonctionne pour n'importe quel nombre d'exécutions de chiffres:
Ce qui est très similaire à la commande grep:
À propos \ d
Sed ne reconnaît pas la syntaxe '\ d' (raccourci). L'équivalent ascii utilisé ci
[0-9]
- dessus n'est pas exactement équivalent. La seule solution alternative consiste à utiliser une classe de caractères: '[[: digit:]] `.La réponse sélectionnée utilise ces "classes de caractères" pour construire une solution:
Cette solution ne fonctionne que pour (exactement) deux séries de chiffres.
Bien sûr, comme la réponse est exécutée à l'intérieur du shell, nous pouvons définir quelques variables pour raccourcir cette réponse:
Mais, comme cela a déjà été expliqué, l'utilisation d'une
s/…/…/gp
commande est préférable:Cela couvrira les deux séries répétées de chiffres et l'écriture d'une commande courte (er).
la source
Je crois que le modèle donné dans la question était à titre d'exemple uniquement, et le but était de correspondre à n'importe quel modèle.
Si vous avez un sed avec l'extension GNU permettant l'insertion d'une nouvelle ligne dans l'espace de motif, une suggestion est:
Ces exemples sont avec tcsh (oui, je sais que c'est le mauvais shell) avec CYGWIN. (Modifier: pour bash, supprimez l'ensemble et les espaces autour de =.)
la source
+
, vous devez l'échapper ou utiliser l'-r
option (-E
pour OS X). Vous pouvez également utiliser\{1,\}
(ou-r
ou-E
sans l'échappement).Abandonnez et utilisez Perl
Puisque
sed
ne le coupe pas, jetons simplement la serviette et utilisons Perl, au moins c'est LSB alors que lesgrep
extensions GNU ne le sont pas :-)Imprimez l'intégralité de la partie correspondante, pas de groupes correspondants ou de recherche nécessaire:
Production:
Correspondance unique par ligne, champs de données souvent structurés:
Production:
Avec lookbehind:
Champs multiples:
Production:
Correspondances multiples par ligne, données souvent non structurées:
Production:
Avec lookbehind:
Production:
la source
Essayer
J'ai obtenu ceci sous cygwin:
la source
Ce n'est pas ce que l'OP a demandé (capture de groupes) mais vous pouvez extraire les chiffres en utilisant:
Donne ce qui suit:
la source