Je veux saisir les deux derniers nombres (un entier, un flottant; suivi d'un espace blanc facultatif) et les imprimer uniquement.
Exemple:
foo bar <foo> bla 1 2 3.4
Devrait imprimer:
2 3.4
Jusqu'à présent, j'ai ce qui suit:
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/replacement/p'
me donnera
foo bar <foo> bla 1 replacement
Cependant, si j'essaye de le remplacer par le groupe 1, la ligne entière est imprimée.
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/\1/p'
Comment puis-je imprimer uniquement la section de la ligne qui correspond à l'expression régulière dans le groupe?
-r
option ou `--regexp-extended` sinon j'obtenaisinvalid reference \1 on
l'erreur RHS` de la commande s.(
et)
au lieu de\(
et\)
..*
à la fin de l'expression rationnelle si la chaîne que vous souhaitez extraire n'est pas toujours à la fin de la ligne..*
est gourmand et sed n'a pas de non-gourmand.*?
(
et)
ne soulèvera pas d'erreur dans ubuntu 16.04. Je pense donc que ce commentaire est dépassé.grep est le bon outil pour l'extraction.
en utilisant votre exemple et votre regex:
la source
grep -o
appels canalisés . stackoverflow.com/a/58314379/117471Et pour encore une autre option, j'irais avec awk!
Cela divisera l'entrée (j'utilise STDIN ici, mais votre entrée pourrait facilement être un fichier) sur des espaces, puis imprimera le dernier champ mais un, puis le dernier champ. le
$NF
variables contiennent le nombre de champs trouvés après avoir explosé sur les espaces.L'avantage de ceci est que peu importe si ce qui précède les deux derniers champs change, tant que vous ne voulez que les deux derniers, cela continuera à fonctionner.
la source
La commande de coupe est conçue pour cette situation exacte. Il "coupera" sur n'importe quel délimiteur et vous pourrez alors spécifier les morceaux à sortir.
Par exemple:
echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
Se traduira par la sortie de:
2 3.4
-d définit le délimiteur
-f sélectionne la plage de «champs» à afficher, dans ce cas, il s'agit du 6ème au 7ème morceaux de la chaîne d'origine. Vous pouvez également spécifier la plage sous forme de liste, par exemple
6,7
.la source
awk '{ print $2" "$6 }'
cut -d " " -f 2,6
Je suis d'accord avec @kent pour dire que c'est bien adapté
grep -o
. Si vous avez besoin d'extraire un groupe dans un pattern, vous pouvez le faire avec un 2nd grep.la source