Deutsch English Français Italiano |
<t6bqdp$2n20$1@cabale.usenet-fr.net> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!news.mixmin.net!aioe.org!news.gegeweb.eu!gegeweb.org!usenet-fr.net!.POSTED!not-for-mail From: Olivier Miakinen <om+news@miakinen.net> Newsgroups: fr.comp.os.linux.configuration Subject: =?UTF-8?Q?Re:_Manipulation_de_cha=c3=aene?= Date: Sun, 22 May 2022 00:51:37 +0200 Organization: There's no cabale Lines: 71 Message-ID: <t6bqdp$2n20$1@cabale.usenet-fr.net> References: <f399de3b-9165-3e25-50ed-80eea97e0e2e@miakinen.net> <slrnt8iotm.8pd.lhh+news-no_spam@hercule.home.arpa> NNTP-Posting-Host: 220.12.205.77.rev.sfr.net Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 8bit X-Trace: cabale.usenet-fr.net 1653173497 89152 77.205.12.220 (21 May 2022 22:51:37 GMT) X-Complaints-To: abuse@usenet-fr.net NNTP-Posting-Date: Sat, 21 May 2022 22:51:37 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0 SeaMonkey/2.49.4 In-Reply-To: <slrnt8iotm.8pd.lhh+news-no_spam@hercule.home.arpa> Bytes: 3423 Bonjour Jacques, Le 22/05/2022 00:12, Jacques L'helgoualc'h a écrit : >> >> Bien sûr je pourrais écrire "${v:0:1}\.${v:1:1}\.${v:2:1}\.${v:3}", mais >> y a-t-il plus simple ? > > $ echo 2718281828459045 | \ > sed -nre '/^[0-9]+$/!{s/^/Fuck /p;q};:x;s/([0-9])([0-9])/\1\\.\2/;/(\\\.[0-9]){3}/{p;q};bx' > 2\.7\.1\.8281828459045 Ouah ! Je n'appellerais pas ça « plus simple », mais avec l'aide de « man sed » tu viens de me faire découvrir la puissance de cette commande que j'étais loin de soupçonner ! Je viens d'apprendre : - le « ! » pour ne pas exécuter une commande si l'adresse ne matche pas ; - les blocs de commandes avec « { » et « } » ; - l'option -n pour supprimer l'auto-print ; - le « p;q » pour afficher le résultat puis quitter ; - les boucles, avec un label (:x) et un branchement (bx). Je connaissais le reste, mais c'était un usage tellement limité ! > > Sans le contrôle initial, plus simple : > > sed -nre ':x;s/([0-9])([0-9])/\1\\.\2/;/\\\..\\\..\\\./{p;q};bx' > > Il faudrait insérer un « /[0-9][0-9]/!{p;Q} », ou modifier le test initial, > si tu es assez pervers pour essayer un nombre de moins de 4 chiffres :) Oui et oui (et non, je ne suis pas assez pervers pour ça, des tests préliminaires évitent d'avoir des nombres plus petits). > > > >> P.-S. : J'ai la même question, mais pour le cas où chaque chiffre (sauf >> éventuellement le dernier) doit être suivi de la séquence. > > $ echo 2718281828459045 | \ > sed -nre ':x;s/([0-9])([0-9])/\1\\.\2/g;tx;p;q' > 2\.7\.1\.8\.2\.8\.1\.8\.2\.8\.4\.5\.9\.0\.4\.5 Ok, du coup j'ai appris aussi les branchements conditionnels avec t ou T. > > Il faut deux passes du s///g d'insertion (ou accepter/supprimer un point final) : > > $ echo 2718281828459045 | \ > sed -nre ':x;s/([0-9])([0-9])/\1\\.\2/gp;tx;q' > 2\.71\.82\.81\.82\.84\.59\.04\.5 > 2\.7\.1\.8\.2\.8\.1\.8\.2\.8\.4\.5\.9\.0\.4\.5 Ok. > Le plus simple : > > echo 2718281828459045 |sed -e 's/[0-9]/&\\./g;s/\\.$//' > 2\.7\.1\.8\.2\.8\.1\.8\.2\.8\.4\.5\.9\.0\.4\.5 Bon sang mais c'est bien sûr ! Je m'en veux de ne pas y avoir pensé moi-même, parce que je connaissais tout ce qu'il fallait pour arriver à cette solution. Un grand merci à toi, c'est vraiment génial cette commande. -- Olivier Miakinen