sed: imprimer uniquement de groupe correspondant
Je tiens à saisir les deux derniers numéros (un int, un float; suivie par des espaces facultatifs) et d'imprimer uniquement eux.
Exemple:
foo bar <foo> bla 1 2 3.4
Doit d'impression:
2 3.4
Jusqu'à présent, j'ai le texte suivant:
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/replacement/p'
va me donner
foo bar <foo> bla 1 replacement
Cependant, si j'essaie de le remplacer avec le groupe 1, l'ensemble de la ligne est imprimée.
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)//p'
Comment puis-je imprimer uniquement la section de la ligne qui correspond à l'expression rationnelle dans le groupe?
Vous devez vous connecter pour publier un commentaire.
Match de l'ensemble de la ligne, il faut donc ajouter un
.*
au début de votre regex. Cela entraîne l'ensemble de la ligne pour être remplacé par le contenu du groupe-r
ou ` --regexp-étendu "option sinon j'ai été faireinvalid reference \1 on
s' de la commande du membre de droite ` erreur.(
et)
au lieu de\(
et\)
..*
à la fin de la regexp si la chaîne que vous souhaitez extraire n'est pas toujours à la fin de la ligne..*
est gourmande et sed n'a pas un non-greedy.*?
grep est le bon outil pour l'extraction.
à l'aide de votre exemple et votre regex:
Et pour encore une autre option, j'irais avec awk!
Ce sera divisée en entrée (je suis en utilisant STDIN ici, mais votre contribution pourrait facilement être un fichier) sur des espaces, et ensuite, imprimez le dernier-mais-un champ, et puis le dernier champ. Le
$NF
variables contenir le nombre de champs trouvés après l'explosion sur les espaces.L'avantage de cela est qu'il n'a pas d'importance si ce qui précède les deux derniers champs de changements, tant que vous ne veux plus jamais les deux derniers, il va continuer à travailler.
La commande cut est conçu pour précisément cette situation. Il sera le "cut" sur un délimiteur et puis vous pouvez spécifier les morceaux devraient être de sortie.
Par exemple:
echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
Entraînera la sortie de:
2 3.4
-d définit le séparateur
-f sélectionne la plage de "champs" à la sortie, dans ce cas, c'est la 6e à la 7e morceaux de la chaîne d'origine. Vous pouvez également spécifier la plage comme une liste, comme
6,7
.awk '{ print $2" "$6 }'
cut -d " " -f 2,6