Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/10/2016, à 03: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, à 05: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, à 05:41)

Hors ligne

#3 Le 30/10/2016, à 12:17

Gatsu

Re : Expression rationnelle - remplacement avec sed

Merci merci ! Ça fonctionne parfaitement. smile

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. tongue

Hors ligne

#4 Le 30/10/2016, à 13: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, à 14: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