Sujet : Re: Manipulation de chaîne
De : lhh+news-no_spam (at) *nospam* free.fr.isnt.invalid (Jacques L'helgoualc'h)
Groupes : fr.comp.os.linux.configurationDate : 22. May 2022, 00:12:06
Autres entêtes
Organisation : Aucune.
Message-ID : <slrnt8iotm.8pd.lhh+news-no_spam@hercule.home.arpa>
References : 1
User-Agent : slrn/1.0.3 (Linux)
Le 21-05-2022, Olivier Miakinen a écrit :
[diapublication, suivi modifiable si nécessaire]
>
Bonjour,
Bonsoir,
Préambule :
Ma question porte sur le kornshell (ksh) sur une machine GNU/Linux,
mais selon que la réponse utilise une builtin du shell ou une commande
externe, elle sera peut-être plus en charte sur fclr, voire un autre
groupe, plutôt que sur fcolc où j'ai placé le suivi. Répondez là où
ça vous semble le mieux ! (Merci.)
>
Dans un ksh j'ai une variable qui contient quatre chiffres ou plus, par
exemple "314159". Je voudrais obtenir une autre variable dans laquelle
les trois premiers chiffres sont suivis chacun de la séquence "\.".
>
"314159" -> "3\.1\.4\.159"
"1234" -> "1\.2\.3\.4"
"123456789" -> "1\.2\.3\.456789"
>
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
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 :)
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
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
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