Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

regex en bash

4 réponses
Avatar
Daniel Caillibaud
Bonjour,

Je sais que bash a un op=C3=A9rateur =3D~ pour les regex, mais j'ai du mal =
=C3=A0 faire
ce que je veux avec et je continue avec sed / awk / grep,

Mais faire du=20
[[ -z "$(echo $truc | sed -Ee 's/ma regex//')" ]]
est assez idiot quand on pourrait faire du=20
[[ "$truc" =3D~ 'ma regex' ]]

mais je n'arrive pas =C3=A0 utiliser ^ et $ dans mes regex, alors que man b=
ash
semble dire que =C3=A7a doit fonctionner comme d'habitude.

Pourquoi

$ [[ 'abcd' =3D~ '^ab' ]] && echo ok || echo KO
KO

$ [[ 'abcd' =3D~ 'cd$' ]] && echo ok || echo KO
KO

??

(je sais, avec zsh ces deux commandes renvoient ok comme on pourrait s'y
attendre=E2=80=A6)

--=20
Daniel

Vous ne sauriez croire avec quelle facilit=C3=A9 l'impossible=20
se fait d=C3=A8s qu'il est n=C3=A9cessaire.
Anatole France

4 réponses

Avatar
Pierre Malard
--Apple-Mail=_D48574FA-2008-40C4-874B-0B92ED83677F
Content-Type: multipart/alternative;
boundary="Apple-Mail=_12255984-0169-4837-9346-F9B841C3006D"
--Apple-Mail=_12255984-0169-4837-9346-F9B841C3006D
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=utf-8
Le 22 déc. 2017 à 09:19, Jean-Marc a écrit :
Thu, 21 Dec 2017 18:13:19 +0100
Daniel Caillibaud écrivait :
Pourquoi ?
$ [[ 'abcd' =~ '^ab' ]] && echo ok || echo KO
KO
$ [[ 'abcd' =~ 'cd$' ]] && echo ok || echo KO
KO
??

Parce qu'entre guillemets, les caractères ^ et $ sont considérés comme des caractères normaux.
$ set -x
$ [[ 'abcd' =~ '^ab' ]] && echo ok || echo KO
+ [[ abcd =~ ^ab ]]
+ echo KO
KO
$ [[ 'abcd' =~ ^'ab' ]] && echo ok || echo KO
+ [[ abcd =~ ^ab ]]
+ echo ok
ok
$ [[ 'abcd' =~ 'cd$' ]] && echo ok || echo KO
+ [[ abcd =~ cd$ ]]
+ echo KO
KO
$ [[ 'abcd' =~ 'cd'$ ]] && echo ok || echo KO
+ [[ abcd =~ cd$ ]]
+ echo ok
ok
un petit "set -x" fonctionne bien, même dans une session interactive.
Joyeux Noël !!!

Cette explication avec appuis de l’exemple est effectivement beaucoup plus claire que ma réponse. Effectivement l’utilisat ion du « set -x » est une excellente façon de voir ce qui se passe.
Merci
--
Pierre Malard
« Si, comme le disait le général de Gaulle, la France n'avait pas été la
France... on peut logiquement penser que tous les français auraient été
des étrangers » ;-)
Pierre Dac
| _,,,---,,_
/,`.-'`' -. ;-;;,_
|,4- ) )-,_. , ( `'-'
'---''(_/--' `-'_) πr
perl -e '$_=q#: 3| 5_,3-3,2_: 3/,`.'"'"'`'"'"' 5-. ;-;;,_: |,A- ) )-,_. , ( `'"'"'-'"'"': '"'"'-3'"'"'2(_/--'"'"' `-'"'"'_): 24πr::#;y#:#n#;s#(D)(d+)#$1x$2#ge;print'
- --> Ce message n’engage que son auteur <--
--Apple-Mail=_12255984-0169-4837-9346-F9B841C3006D
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
charset=utf-8
<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">Le 22 déc. 2017 à 09:19, Jean-Marc &lt;<a href="mailto:" class=""></a>&gt; a écrit :</div><br class="Apple-interchange-newline"><div class=""><div class="">Thu, 21 Dec 2017 18:13:19 +0100<br class="">Daniel Caillibaud &lt;<a href="mailto:" class=""></a>&gt; écrivait :<br class=""><br class=""><blockquote type="cite" class="">Pourquoi ?<br class=""><br class="">$ [[ 'abcd' =~ '^ab' ]] &amp;&amp; echo ok || echo KO<br class="">KO<br class=""><br class="">$ [[ 'abcd' =~ 'cd$' ]] &amp;&amp; echo ok || echo KO<br class="">KO<br class=""><br class="">??<br class=""><br class="">Parce qu'entre guillemets, les caractères ^ et $ sont considérés comme des caractères normaux.<br class=""><br class="">$ set -x<br class=""><br class="">$ [[ 'abcd' =~ '^ab' ]] &amp;&amp; echo ok || echo KO<br class="">+ [[ abcd =~ ^ab ]]<br class="">+ echo KO<br class="">KO<br class=""><br class="">$ [[ 'abcd' =~ ^'ab' ]] &amp;&amp; echo ok || echo KO<br class="">+ [[ abcd =~ ^ab ]]<br class="">+ echo ok<br class="">ok<br class=""><br class="">$ [[ 'abcd' =~ 'cd$' ]] &amp;&amp; echo ok || echo KO<br class="">+ [[ abcd =~ cd$ ]]<br class="">+ echo KO<br class="">KO<br class=""><br class="">$ [[ 'abcd' =~ 'cd'$ ]] &amp;&amp; echo ok || echo KO<br class="">+ [[ abcd =~ cd$ ]]<br class="">+ echo ok<br class="">ok<br class=""><br class="">un petit "set -x" fonctionne bien, même dans une session interactive.<br class=""><br class="">Joyeux Noël !!!<br class=""></div></div><br class=""></div><div>Cette explication avec appuis de l’exemple est effectivement beaucoup plus claire que ma réponse. Effectivement l’utilisation du «&nbsp;set -x&nbsp;» est une excellente façon de voir ce qui se passe.</div><div><br class=""></div><div>Merci</div><br class=""><div class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="margin: 0px; font-size: 10px; font-family: 'Courier New';" class="">--&nbsp;</div><div style="margin: 0px; font-size: 10px; font-family: 'Courier New';" class="">Pierre Malard</div><div style="margin: 0px; font-size: 10px; font-family: 'Courier New'; min-height: 11px;" class=""><br class=""></div><div style="margin: 0px; font-family: Times;" class="">&nbsp; &nbsp;«&nbsp;<i class="">Si, comme le disait le général de Gaulle, la France n'avait pas été la</i></div><div style="margin: 0px; font-family: Times;" class=""><i class="">&nbsp;&nbsp;&nbsp;France... on peut logiquement penser que tous les français auraient été</i></div><div style="margin: 0px; font-family: Times;" class=""><i class="">&nbsp;&nbsp;&nbsp;des étrangers</i>&nbsp;» ;-)</div><div style="margin: 0px; font-family: Times;" class="">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Pierre Dac</div><div style="margin: 0px; font-size: 10px; font-family: 'Courier New';" class="">&nbsp;&nbsp;&nbsp;|&nbsp; &nbsp; &nbsp;&nbsp;_,,,---,,_</div><div style="margin: 0px; font-size: 10px; font-family: 'Courier New';" class="">&nbsp;&nbsp;&nbsp;/,`.-'`'&nbsp; &nbsp;&nbsp;-.&nbsp;&nbsp;;-;;,_</div><div style="margin: 0px; font-size: 10px; font-family: 'Courier New';" class="">&nbsp;&nbsp;|,4-&nbsp;&nbsp;) )-,_. , (&nbsp;&nbsp;`'-'</div><div style="margin: 0px; font-size: 10px; font-family: 'Courier New';" class="">&nbsp;'---''(_/--'&nbsp;&nbsp;`-'_) &nbsp; πr</div><div style="margin: 0px; font-family: Times; min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-size: 10px; font-family: 'Courier New';" class="">perl -e '$_=q#: 3| 5_,3-3,2_: 3/,`.'"'"'`'"'"' 5-. &nbsp;;-;;,_: &nbsp;|,A- &nbsp;) )-,_. , ( &nbsp;`'"'"'-'"'"': '"'"'-3'"'"'2(_/--'"'"' &nbsp;`-'"'"'_): 24πr::#;y#:#n#;s#(D)(d+)#$1x$2#ge;print'</div><div style="margin: 0px; font-family: 'Courier New';" class=""><span style="font-size: 10px;" class="">- --&gt; Ce message n’engage que son auteur &lt;--</span></div></div></div>
</div>
<br class=""></body></html>
--Apple-Mail=_12255984-0169-4837-9346-F9B841C3006D--
--Apple-Mail=_D48574FA-2008-40C4-874B-0B92ED83677F
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=signature.asc
Content-Type: application/pgp-signature;
name=signature.asc
Content-Description: Message signed with OpenPGP
-----BEGIN PGP SIGNATURE-----
Version: GnuPG/MacGPG2 v2.2
Comment: GPGTools - http://gpgtools.org
iQIzBAEBCgAdFiEE0KHTJ+AWKhmI+acm/pSWHuad/BgFAlo8yEIACgkQ/pSWHuad
/Bgblw//R+wVl5qmQtNp3aw4Hr+knShqJ17A2eRe/EpKVY36y3iQlSjd8HRG5s2Q
A6shcyTgBfxEH65tEv9prhojLZwajmfmMqe3XzjPizUxIbVjA0QIogE9YO0xzXOL
hPNlfKQljrLfmsmft93keqrfTyxpaH+JWQ5TQH5/0ynwMc2zjPghogqgG0G54dA3
7N689VqXlXJJJNvgJYlz6mvc4Sy3p0jvymfDsjvyTdLpHTfiKkWwkwR/PTwIAqr8
2BjFX1TsZf4VMGoPLVFm2eeVZtloa3mDOAxMxXOFoRQkB98P7sJ8wmDXsZATtSO1
4Zx3l7Z8RA3wD1Dc8wEX5R3hRMbfVu1xMfNFhAPzKnfUvPE6AE+aG+F9ILzRcNOT
EFieJ6yStg9cTxRkwh82euDzDnvh9yK2XabliYEkAOe5XUJG8U2firwNiiKPVCVR
PAskgE+M4Av/DoxsqbzLNzWCCTk/q0hNjyOUyqMpNyJil2hUi+NaaEkjosuszjiY
XZU3MDYMkORcWO68YZHeR/duvdXUZ16EQw+RfnfJTAI3wS508xSmZfMNKhECS/Ex
+Si2fGjUh6unhBbfmP+D0cFrs8b5zhQYelTFV2AiO/newJpA9m0/1D5NhFMyOvNB
SI3jaiT24yVAoIMGIIQGYxuQ8iAkiyUO/pbuVUy2+eWf0lMhtow =nDI7
-----END PGP SIGNATURE-----
--Apple-Mail=_D48574FA-2008-40C4-874B-0B92ED83677F--
Avatar
Jean-Marc
--Signature=_Fri__22_Dec_2017_13_49_08_+0100_oDNs5X2GYFJggOji
Content-Type: text/plain; charset=UTF-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
Fri, 22 Dec 2017 13:35:06 +0100
Daniel Caillibaud écrivait :
Ça va me motiver pour enfin passer à zsh ;-)

Tu nous diras ce que tu penses de zsh ?
Parce que moi, j'ai taté un peu mais sans être convaincu.
Et j'ai toujours trouvé tout ce dont j'ai besoin dans un bash.
Jean-Marc
--Signature=_Fri__22_Dec_2017_13_49_08_+0100_oDNs5X2GYFJggOji
Content-Type: application/pgp-signature
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEEWjgcRC0dCXkfm9hQHHLXC3pxPwFAlo8/0QACgkQQHHLXC3p
xPw5Dw//WtNAp2uwowDxxBBCUYOa+k/0wT9l2pRlcuVrBGGjuqVX7QT8auSr5enK
0iKG9YrKyQ1QgJJpxobGryhSQAhbLeUTk48+uknoJPzUxjndOKR6MclnVLpmDSc+
HsTe2OP7SuhFFODsc7DZ2UrWhGZRyet1xW2U/aw+0QZzd9WYbjDuIWI1CvhDIaj/
QLHxUqfLByeXyOvUWhkGqug6pxwOUE6ZBxL/5dxRjkVo2TJSsH8/NDAYu4LyJuC8
OOD3rjMUUBUmJczFA9zXScpdjhMpv9NKvqErKpaMiJ+B6tR7OpbVgxIHfo1YFxAz
afYrd0DCdvxI8ZkWIkCb3GI/mhIfRReCe8o1svAWrUya3yoXpYRwHknlbpgXzebQ
2BufgFcLqmS3O1IqZj2uaJ7dEUz/ypS4XQDn3F13TrnYCNRr9OLSfHTl0SvrpN/+
G4ZclYL/acK86/VUdpt9Jdk3faEyCwvTjneVSk7VPCNn877ORTeQNOc6h2FbYsKZ
xvXQuUgiFIayrPiaYbFs2yywwRV7jHPWXP5NLuPGVuInt0JFPAxYXSp1iF3Bp4dP
jBMw5uYiWaI+NVccnTNR6H0CojYfi0HSeT9vdmx3KThsccjZoxWoO5zPv3i+CKP5
BhUnJ1040qe+Ock1foeUt8K74AOEU55IG9ZZE3Rw09R0F00IDFg =xoMN
-----END PGP SIGNATURE-----
--Signature=_Fri__22_Dec_2017_13_49_08_+0100_oDNs5X2GYFJggOji--
Avatar
Andre Majorel
On 2017-12-21 18:13 +0100, Daniel Caillibaud wrote:
Je sais que bash a un opérateur =~ pour les regex, mais j'ai
du mal à faire ce que je veux avec et je continue avec sed /
awk / grep,
Mais faire du
[[ -z "$(echo $truc | sed -Ee 's/ma regex//')" ]]
est assez idiot quand on pourrait faire du
[[ "$truc" =~ 'ma regex' ]]

Même si ça rentre probablement dans votre catégorie "assez
idiot", je tiens à signaler l'existence de la commande expr(1)
qui a l'avantage de fonctionner sur tout Unix. Contrairement à
quelque solution reposant sur Bash, Zsh ou l'option -E de sed
qui non seulement n'est pas standard mais n'est même pas
documentée. Ce qui est, comme chacun sait, toujours un bon
signe. :->
Si la regexp commence par "^"
expr "$truc" : 'ma_regexp' >/dev/null
sinon
expr "$truc" : '.*ma_regexp' >/dev/null
--
André Majorel <http://www.teaser.fr/~amajorel/>
bugs.debian.org, an essential online resource for spammers.
Avatar
Daniel Caillibaud
Le 23/12/17 à 09:50, Andre Majorel a écrit :
AM> Même si ça rentre probablement dans votre catégorie "ass ez
AM> idiot", je tiens à signaler l'existence de la commande expr(1)
Merci pour le rappel, tu as raison c'est plus portable.
AM> qui a l'avantage de fonctionner sur tout Unix. Contrairement à
AM> quelque solution reposant sur Bash, Zsh ou l'option -E de sed
AM> qui non seulement n'est pas standard mais n'est même pas
AM> documentée.
Si, justement, -E est la version portable et documentée. J'utilisais
toujours -r et j'ai pris le pli de remplacer par -E car man sed dit :
-E, -r, --regexp-extended
use extended regular expressions in the script (for
portability use POSIX -E).
--
Daniel
Les champignons poussent dans les endroits humides. C'est
pourquoi ils ont la forme d'un parapluie.
Alphonse Allais