335 votes

Groupe, capturant

Y a-t-il une manière de dire sed à la sortie seulement les groupes capturés ? par exemple, donné par entrée :

et le motif

Je pourrais obtenir sortie seulement 123 et 987 de la manière formatée par références arrières peut-être ?

405voto

Dennis Williamson Points 105818

La clé de l'obtention de ce travail est de raconter sed d'exclure ce que vous ne voulez pas être de sortie ainsi que la spécification de ce que vous voulez.

string='This is a sample 123 text and some 987 numbers'
echo "$string" | sed -rn 's/[^[:digit:]]*([[:digit:]]+)[^[:digit:]]+([[:digit:]]+)[^[:digit:]]*/\1 \2/p'

Cela en dit:

  • n'est pas par défaut pour l'impression de chaque ligne (-n)
  • exclure zéro, un ou plusieurs chiffres
  • inclure un ou plusieurs chiffres
  • exclure un ou plusieurs chiffres
  • inclure un ou plusieurs chiffres
  • exclure zéro, un ou plusieurs chiffres
  • imprimer la substitution (p)

Si vous avez GNU grep (il peut aussi travailler dans des BSD, y compris OS X):

echo "$string" | grep -Po '\d+'

ou des variantes telles que:

echo "$string" | grep -Po '(?<=\D )(\d+)'

L' -P option permet à Perl Compatible Regular Expressions. Voir man 3 pcrepattern ou man 3 pcresyntax.

56voto

Peter McG Points 6385

Sed a jusqu'à neuf modèles de souvenir, mais vous avez besoin d’utiliser des parenthèses avec séquence d’échappement de se souvenir de certaines parties de l’expression régulière.

Voir ici pour des exemples et plus de détails

35voto

ghostdog74 Points 86060

vous pouvez utiliser grep

10voto

Joseph Quinsey Points 4450

Je crois que le dessin donné dans la question a été à titre d’exemple seulement, et le but était pour correspondre à n’importe quel modèle.

Si vous avez un sed avec GNU extension autorisant insérer un saut de ligne dans l’espace modèle, une suggestion est :

Ces exemples sont avec tcsh (Oui, je sais que c’est la coque mal) avec CYGWIN. (Edit : pour bash, retirer ensemble, ainsi que les espaces autour =.)

4voto

Bert F Points 27237

Essayez

J’ai eu ce sous cygwin :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X