regex en bash

Le
Daniel Caillibaud
Bonjour,

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' ]]

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

Pourquoi

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

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

??

(je sais, avec zsh ces deux commandes renvoient ok comme on pourrait s'y
attendre…)

--
Daniel

Vous ne sauriez croire avec quelle facilité l'impossible
se fait dès qu'il est nécessaire.
Anatole France
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pierre Malard
Le #26456676
--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 Thu, 21 Dec 2017 18:13:19 +0100
Daniel Caillibaud
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
</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--
Jean-Marc
Le #26456742
--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
Ç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--
Andre Majorel
Le #26456809
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 bugs.debian.org, an essential online resource for spammers.
Daniel Caillibaud
Le #26456843
Le 23/12/17 à 09:50, Andre Majorel 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
Publicité
Poster une réponse
Anonyme