Path: csiph.com!pasdenom.info!usenet-fr.net!.POSTED!not-for-mail From: Olivier Miakinen Newsgroups: fr.comp.os.unix Subject: Re: Shell : extraire d'une chaine plusieurs sous-chaines Date: Wed, 26 Nov 2025 11:55:36 +0100 Organization: There's no cabale Lines: 41 Message-ID: <10g6mb9$16sl$1@cabale.usenet-fr.net> References: <10g4rbq$2i1$1@cabale.usenet-fr.net> <10g57g3$20kd$1@cabale.usenet-fr.net> NNTP-Posting-Host: 2a02-8424-7701-5901-e8d5-91a4-b9c9-5f47.rev.sfr.net Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Trace: cabale.usenet-fr.net 1764154537 39829 2a02:8424:7701:5901:e8d5:91a4:b9c9:5f47 (26 Nov 2025 10:55:37 GMT) X-Complaints-To: abuse@usenet-fr.net NNTP-Posting-Date: Wed, 26 Nov 2025 10:55:37 +0000 (UTC) User-Agent: Betterbird (Linux) Content-Language: en-US Cancel-Lock: sha256:RBJ8ZsgqBnW/tYT/qu1JcXK8SA2O9g+qJLDzRY5h1cg= Cancel-Key: sha256:f0rHwfZXp5iKFjTbX/I5bQXh9Dta33nWBzLi8f9oaoM= In-Reply-To: Xref: csiph.com fr.comp.os.unix:8138 Le 26/11/2025 à 00:48, Christian Weisgerber a écrit : > On 2025-11-25, Olivier Miakinen wrote: > >>> S'il y a un caractère qui n'apparait pas dans la chaine, >> >> Héla non. Il y a bien un caractère qui n'apparait pas dans la chaine >> à certains endroits dans le cas réel, mais seulement à deux endroits >> alors que la chaine doit être coupée en plus de six morceaux. > > J'imagine que le saut de ligne n'apparait dans la chaine ? En effet. Même dans le cas réel il n'y a que des lettres (d'ailleurs majuscules entre A et Z), des chiffres et des tirets. > while read -r v1 && read -r v2 && read -r v3 && read -r v4; do > echo "v1=$v1 v2=$v2 v3=$v3 v4=$v4" > done < $(perl -pe 's/([a-z]+)([0-9])([a-z]*)([0-9]+)/$1\n$2\n$3\n$4/') > EOF C'est presque parfait ! J'ai simplement ajouté un « ^ » et un « $ » respectivement au début et à la fin de la regex pour m'assurer qu'il n'y ait pas de caractères parasites au début de v1 ou à la fin de v4. J'ai quand même deux questions. D'abord, à quoi sert l'option -p de perl ? D'après les docs que j'ai lues ça ferait une boucle, mais même sur une seule chaine en entrée retirer cette option fait que ça ne fonctionne plus. Par ailleurs, pour le moment cela fonctionne si je passe la chaine en entrée du script dans stdin, mais je voudrais plutôt que cette chaine soit une variable dans le script. Comment changer le code pour cela ? Je suis désolé si mes questions sont triviales mais hélas je n'ai jamais pratiqué perl. Cordialement, -- Olivier Miakinen