#1 Le 30/10/2016, à 02:50
- Gatsu
Expression rationnelle - remplacement avec sed
Bonjour
J'utilise un petit script bash pour lancer mes jeux avec wine, et j'aimerais en profiter pour afficher les FPS vu que l'option existe. Cependant je dois passer par une expression rationnelle pour obtenir ce que je veux, et franchement je n'y pige pas grand chose. D'où mon appel à l'aide.
J'ai récupéré un exemple sur ce Gist GitHub, ce qui donne en simplifiant les choses :
WINEDEBUG=fps wine "$@" 2>&1 | tee /dev/stderr | \
sed -u -n '/^trace:fps:/{s/.* \([^ ]*\)fps/\1/;p}' | \
osd_cat -l1 -f "-*-*-*-*-*-*-32-*-*-*-*-*-*-*" -O1 -c "yellow"
que j'ai ensuite adapté à ma sauce :
export WINEDEBUG=-all,+fps
wine "${Executable}" 2>&1 | \
sed -u -n '/^trace:fps:/{s/.* \([^ ]*\)fps/\1/;p}' | \
osd_cat -l1 -f "-*-*-*-*-*-*-18-*-*-*-*-*-*-*" -O1 -c "green"
Ligne 1: Permet de supprimer tous les messages de debug, et d'afficher ceux concernant les fps sur la sortie stderr.
Ligne 2: Je lance l'exécutable et je redirige la sortie stderr vers stdout. J'ai supprimé le tee, je n'ai aucun intérêt à renvoyer ces messages dans un fichier.
Ligne 3: Mon problème.
Ligne 4: J'affiche le résultat de la ligne 3 avec osd_cat. Avec un petit man osd_cat et xfontsel pour connaitre les bonnes options.
Un exemple de la sortie de wine :
fixme:winediag:start_process Wine Staging 1.9.21 is a testing version containing experimental patches.
fixme:winediag:start_process Please mention your exact version when filing bug reports on winehq.org.
wine: cannot find L"C:\\windows\\system32\\winemenubuilder.exe"
err:wineboot:ProcessRunKeys Error running cmd L"C:\\windows\\system32\\winemenubuilder.exe -a -r" (2)
trace:fps:swapchain_gl_present 0x14d200 @ approx 0.00fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 1808.13fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 1911.39fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 1964.69fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 1987.34fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 225.77fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 1712.19fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 1072.27fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 1972.02fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 2019.99fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 2012.66fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 1405.06fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 933.42fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 855.43fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 804.26fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 21.66fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 818.24fps
trace:fps:swapchain_gl_present 0x14d200 @ approx 937.38fps
Tout fonctionne comme prévu, j'ai 0.00 puis 1808.13, puis 1911.39, etc. qui s'affichent successivement à l'écran, sauf que j'aimerais conserver uniquement la partie entière et supprimer les décimales pour simplifier l'affichage et je ne sais pas du tout comment faire.
D'où ma question : comment faire pour ne conserver que ce qui est entre "approx " et le "." dans les lignes commençant par "trace:fps:" ?
Hors ligne
#2 Le 30/10/2016, à 04:38
- pingouinux
Re : Expression rationnelle - remplacement avec sed
Bonjour,
Ceci, par exemple
sed -u -nr '/^trace:fps:/s/.* ([0-9]+)\..*/\1/p' | \
Dernière modification par pingouinux (Le 30/10/2016, à 04:41)
Hors ligne
#3 Le 30/10/2016, à 11:17
- Gatsu
Re : Expression rationnelle - remplacement avec sed
Merci merci ! Ça fonctionne parfaitement.
Le pire c'est que je comprends grosso-modo ce qui est fait, mais je suis totalement incapable d'en former une fonctionnelle par moi-même.
/^trace:fps:
Dans toutes les lignes commençant par "trace:fps:"
/s
On fait une substitution
/.* ([0-9]+)\..*
De n'importe quel caractère, suivi d'un espace, puis (1 ou plusieurs chiffres), suivi d'un point, puis n'importe quel caractère
/\1
On ne conserve que la partie entre parenthèse
/p
On imprime le résultat
En même temps, c'est toujours plus simple avec la solution sous les yeux. Quoique, je vois qu'il y a un petit -nr qui s'est glissé entre deux, ceci expliquant peut-être mes échecs. Un jour peut-être, y arriverai-je.
Hors ligne
#4 Le 30/10/2016, à 12:16
- pingouinux
Re : Expression rationnelle - remplacement avec sed
En fait, la commande se décompose ainsi :
/^trace:fps:/
s/.* ([0-9]+)\..*/\1/
p
Quoique, je vois qu'il y a un petit -nr qui s'est glissé entre deux, ceci expliquant peut-être mes échecs.
Non, le -r (ou --regexp-extended) permet de simplifier la commande. Sans ce paramètre, on aurait fait :
sed -u -n '/^trace:fps:/s/.* \([0-9]\+\)\..*/\1/p' | \
Hors ligne
#5 Le 30/10/2016, à 13:07
- Gatsu
Re : Expression rationnelle - remplacement avec sed
Ah ok. Donc sans le -r il fallait encore en plus que j'échappe le + derrière [0-9]. J'y serais jamais arrivé tout seul. Mais maintenant que tu le dis, c'est vrai que c'est expliqué clairement dans la doc.
Merci pour cette explication, je tâcherai de m'en souvenir dans mes prochains essais.
Hors ligne