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

Script pour sonder les capacit=c3=a9s de bash=2c expr et sed sur Mac

7 réponses
Avatar
Olivier Miakinen
#!/bin/bash

echo 'expr "(abc)" : "[()]*" -- attendu : 1'
expr "(abc)" : "[()]*"

echo 'expr "((()abc))" : "[()]*" -- attendu : 4'
expr "((()abc))" : "[()]*"

echo 'expr "((" : "[()]*" -- attendu : 2'
expr "((" : "[()]*"

echo 'expr "(" : "[()]*" -- attendu : erreur de syntaxe'
expr "(" : "[()]*"

echo 'expr "(abc)" : "\([()]*\)" -- attendu : ('
expr "(abc)" : "\([()]*\)"

echo 'expr "((()abc))" : "\([()]*\)" -- attendu : ((()'
expr "((()abc))" : "\([()]*\)"

echo 'expr "((" : "\([()]*\)" -- attendu : (('
expr "((" : "\([()]*\)"

echo 'expr "(" : "\([()]*\)" -- attendu : erreur de syntaxe'
expr "(" : "\([()]*\)"

echo 'expr + "(" : "[()]*" -- attendu : 1'
expr + "(" : "[()]*"

echo 'expr "_(" : "_[()]*" -- attendu : 2'
expr "_(" : "_[()]*"

echo 'expr "_(" : "_\([()]*\)" -- attendu : ('
expr "_(" : "_\([()]*\)"

echo 'expr "((()abc))" : ".*[^()]\([()]*\)$" -- attendu : ))'
expr "((()abc))" : ".*[^()]\([()]*\)$"

echo 'expr + "((()abc))" : ".*[^()]\([()]*\)$" -- attendu : ))'
expr + "((()abc))" : ".*[^()]\([()]*\)$"

var="a(bc)def(gh)i"

echo 'echo "${#var}" -- attendu : 13'
echo "${#var}"

echo 'expr length "${var}" -- attendu : 13'
expr length "${var}"

echo 'echo "${var#*[()]}" -- attendu : bc)def(gh)i'
echo "${var#*[()]}"

echo 'echo "${var##*[()]}" -- attendu : i'
echo "${var##*[()]}"

echo 'echo "${var%[()]*}" -- attendu : a(bc)def(gh'
echo "${var%[()]*}"

echo 'echo "${var%%[()]*}" -- attendu : a'
echo "${var%%[()]*}"

var2="abcdefghi"

echo 'echo "${var2:2}" -- attendu : cdefghi'
echo "${var2:2}"

echo 'echo "${var2:0:2}" -- attendu : ab'
echo "${var2:0:2}"

echo 'echo "${var2:(-2)}" -- attendu : hi'
echo "${var2:(-2)}"

echo 'echo "${var2: -2}" -- attendu : hi'
echo "${var2: -2}"

echo 'echo "${var2:0:(-2)}" -- attendu : abcdefg'
echo "${var2:0:(-2)}"

echo 'echo "${var2:0: -2}" -- attendu : abcdefg'
echo "${var2:0: -2}"

var3="((()abc))"
echo "var3=$var3"
prefixe=$(expr "${var3}" : "\([()]*\)")
echo 'prefixe -- attendu : ((()'
echo $prefixe
var3=${var3:${#prefixe}}
echo 'reste -- attendu : abc))'
echo $var3
suffixe=$(expr "${var3}" : ".*[^()]\([()]*\)$")
echo 'suffixe -- attendu : ))'
echo $suffixe
var3=${var3:0: -${#suffixe}}
echo 'reste -- attendu : abc'
echo $var3

var3="((()abc))de"
echo "var3=$var3"
prefixe=$(expr "${var3}" : "\([()]*\)")
echo 'prefixe -- attendu : ((()'
echo $prefixe
var3=${var3:${#prefixe}}
echo 'reste -- attendu : abc))de'
echo $var3
suffixe=$(expr "${var3}" : ".*[^()]\([()]*\)$")
echo 'suffixe -- attendu : '
echo $suffixe
var3=${var3:0: -${#suffixe}}
echo 'reste -- attendu : abc))de (en fait vide car -0 = 0)'
echo $var3

echo "((()abc()def))"
echo "((()abc()def))" | sed -e 's/^\([()]*\).*/\1/'
echo "((()abc()def))" | sed -e 's/^[()]*//' -e 's/[()]*$//'
echo "((()abc()def))" | sed -e 's/.*[^()]\([()]*\).*/\1/'

--
Olivier Miakinen

7 réponses

Avatar
josephb
Olivier Miakinen <om+ posta une série de tests :
#!/bin/bash etc.

Je ne mets ci-dessous que les expressions qui n'ont pas retourné le résultat
attendu ou alors semble équivoque (pour moi)
expr + "(" : "[()]*" -- attendu : 1
imac:~ iMacJB$ expr + "(" : "[()]*"
expr: syntax error
expr + "((()abc))" : ".*[^()]([()]*)$" -- attendu : ))
imac:~ iMacJB$ expr + "((()abc))" : ".*[^()]([()]*)$"
expr: syntax error
imac:~ iMacJB$ var="a(bc)def(gh)i"
expr length "${var}" -- attendu : 13
imac:~ iMacJB$ expr length "${var}"
expr: syntax error
imac:~ iMacJB$ var2="abcdefghi"
echo "${var2:0:(-2)}" -- attendu : abcdefg
imac:~ iMacJB$ echo "${var2:0:(-2)}"
-bash: (-2): substring expression < 0
echo "${var2:0: -2}" -- attendu : abcdefg
imac:~ iMacJB$ echo "${var2:0: -2}"
-bash: -2: substring expression < 0
imac:~ iMacJB$ var3="((()abc))"
imac:~ iMacJB$ var3=${var3:0: -${#suffixe}}
-bash: -${#suffixe}: substring expression < 0
imac:~ iMacJB$ echo 'reste -- attendu : abc'
reste -- attendu : abc
imac:~ iMacJB$ echo $var3
abc))
var3=((()abc))de
imac:~ iMacJB$ suffixe=$(expr "${var3}" : ".*[^()]([()]*)$")
imac:~ iMacJB$ echo 'suffixe -- attendu : '
suffixe -- attendu :
imac:~ iMacJB$ echo $suffixe
<en réponse, ici une ligne vide>
imac:~ iMacJB$ var3=${var3:0: -${#suffixe}}
imac:~ iMacJB$ echo 'reste -- attendu : abc))de (en fait vide car -0 = 0)'
reste -- attendu : abc))de (en fait vide car -0 = 0)
imac:~ iMacJB$ echo $var3
<en réponse, ici une ligne vide>
Je mets l'intégralité des essais avec sed, qui m'ont l'air conformes
imac:~ iMacJB$ echo "((()abc()def))" | sed -e 's/^([()]*).*/1/'
((()
imac:~ iMacJB$ echo "((()abc()def))" | sed -e 's/^[()]*//' -e 's/[()]*$//'
abc()def
imac:~ iMacJB$ echo "((()abc()def))" | sed -e 's/.*[^()]([()]*).*/1/'
))
imac:~ iMacJB$ var3=((()abc))de
Le reste OK.
Si ça peut t'aider ;-)
--
J. B.
Avatar
Olivier Miakinen
Bonjour, et merci pour ta réponse. Je vais analyser ce que ça signifie.
Le 19/10/2019 02:10, Joseph-B a écrit :
Olivier Miakinen <om+ posta une série de tests :
#!/bin/bash etc.

Je ne mets ci-dessous que les expressions qui n'ont pas retourné le résultat
attendu ou alors semble équivoque (pour moi)
expr + "(" : "[()]*" -- attendu : 1
imac:~ iMacJB$ expr + "(" : "[()]*"
expr: syntax error
expr + "((()abc))" : ".*[^()]([()]*)$" -- attendu : ))
imac:~ iMacJB$ expr + "((()abc))" : ".*[^()]([()]*)$"
expr: syntax error

Donc : impossible d'utiliser le '+' dans 'expr' pour lui dire que
la chaîne "(" est vraiment une chaîne à tester et pas un mot-clé.
Évidemment ça ne marche pas non plus pour une chaîne plus longue.
Mais j'avais trouvé un contournement en ajoutant un caractère '_'
à la fois à la chaîne à tester et à la regexp.
imac:~ iMacJB$ var="a(bc)def(gh)i"
expr length "${var}" -- attendu : 13
imac:~ iMacJB$ expr length "${var}"
expr: syntax error

Ok. Heureusement, la syntaxe ${#var} semble fonctionner puisque tu
ne l'as pas mise dans ta réponse.
imac:~ iMacJB$ var2="abcdefghi"
echo "${var2:0:(-2)}" -- attendu : abcdefg
imac:~ iMacJB$ echo "${var2:0:(-2)}"
-bash: (-2): substring expression < 0
echo "${var2:0: -2}" -- attendu : abcdefg
imac:~ iMacJB$ echo "${var2:0: -2}"
-bash: -2: substring expression < 0

Donc pas de substring avec un index compté à partir de la fin de la chaîne.
Ça va être simple, c't'affaire.
imac:~ iMacJB$ var3="((()abc))"
imac:~ iMacJB$ var3=${var3:0: -${#suffixe}}
-bash: -${#suffixe}: substring expression < 0
imac:~ iMacJB$ echo 'reste -- attendu : abc'
reste -- attendu : abc
imac:~ iMacJB$ echo $var3
abc))

Même chose.
var3=((()abc))de
imac:~ iMacJB$ suffixe=$(expr "${var3}" : ".*[^()]([()]*)$")
imac:~ iMacJB$ echo 'suffixe -- attendu : '
suffixe -- attendu :
imac:~ iMacJB$ echo $suffixe
<en réponse, ici une ligne vide>

Oui, ça c'est OK.
imac:~ iMacJB$ var3=${var3:0: -${#suffixe}}
imac:~ iMacJB$ echo 'reste -- attendu : abc))de (en fait vide car -0 = 0)'
reste -- attendu : abc))de (en fait vide car -0 = 0)
imac:~ iMacJB$ echo $var3
<en réponse, ici une ligne vide>

Idem.
Je mets l'intégralité des essais avec sed, qui m'ont l'air conformes
imac:~ iMacJB$ echo "((()abc()def))" | sed -e 's/^([()]*).*/1/'
((()
imac:~ iMacJB$ echo "((()abc()def))" | sed -e 's/^[()]*//' -e 's/[()]*$//'
abc()def
imac:~ iMacJB$ echo "((()abc()def))" | sed -e 's/.*[^()]([()]*).*/1/'
))
imac:~ iMacJB$ var3=((()abc))de

Ça au moins c'est une bonne nouvelle.
Le reste OK.
Si ça peut t'aider ;-)

Grandement. Merci !
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 19/10/2019 03:25, je répondais à Joseph-B :
Bonjour, et merci pour ta réponse.

Dernier test :
#!/bin/bash
decortique()
{
p123="$1"
p1=$(printf "%s" "${p123}" | sed -e 's/^([()]*).*/1/')
p23="${p123:${#p1}}"
p2=$(printf "%s" "${p23}" | sed -e 's/[()]*$//')
p3="${p23:${#p2}}"
echo "'${p123}' -> '${p1}' / '${p2}' / '${p3}'"
}
decortique "(Arvo Part)"
decortique "Arvo Part)"
decortique "(Arvo Part"
decortique "Arvo Part"
decortique "(()(Arvo)(Part))()"
decortique "Arvo)(Part))()"
decortique "(()(Arvo)(Part"
decortique "Arvo)(Part"
--
Olivier Miakinen
Avatar
M.V.
C'est à 03:49 le 19 octobre 2019 que le dénommé Olivier Miakinen a
écrit ces lignes :
Dernier test :

MV$ /usr/local/bin/test_Mac.sh
'(Arvo Part)' -> '(' / 'Arvo Part' / ')'
'Arvo Part)' -> '' / 'Arvo Part' / ')'
'(Arvo Part' -> '(' / 'Arvo Part' / ''
'Arvo Part' -> '' / 'Arvo Part' / ''
'(()(Arvo)(Part))()' -> '(()(' / 'Arvo)(Part' / '))()'
'Arvo)(Part))()' -> '' / 'Arvo)(Part' / '))()'
'(()(Arvo)(Part' -> '(()(' / 'Arvo)(Part' / ''
'Arvo)(Part' -> '' / 'Arvo)(Part' / ''
--
Michel VAUQUOIS - http://michelvauquois.fr
Avatar
Olivier Miakinen
Le 19/10/2019 04:06, M.V. a écrit :
C'est à 03:49 le 19 octobre 2019 que le dénommé Olivier Miakinen a
écrit ces lignes :
Dernier test :

MV$ /usr/local/bin/test_Mac.sh
'(Arvo Part)' -> '(' / 'Arvo Part' / ')'
'Arvo Part)' -> '' / 'Arvo Part' / ')'
'(Arvo Part' -> '(' / 'Arvo Part' / ''
'Arvo Part' -> '' / 'Arvo Part' / ''
'(()(Arvo)(Part))()' -> '(()(' / 'Arvo)(Part' / '))()'
'Arvo)(Part))()' -> '' / 'Arvo)(Part' / '))()'
'(()(Arvo)(Part' -> '(()(' / 'Arvo)(Part' / ''
'Arvo)(Part' -> '' / 'Arvo)(Part' / ''

Parfait !
--
Olivier Miakinen
Avatar
josephb
Olivier Miakinen <om+ wrote:
Parfait !

Ici, comme chez Michel ;-)
--
J. B.
Avatar
josephb
Olivier Miakinen <om+ wrote:
Ok. Heureusement, la syntaxe ${#var} semble fonctionner puisque tu
ne l'as pas mise dans ta réponse.

Oui, et je mets la commande pour que tu vérifies
imac:~ iMacJB$ var="a(bc)def(gh)i"
echo "${#var}" -- attendu : 13
imac:~ iMacJB$ echo "${#var}"
13
Je mets l'intégralité des essais avec sed, qui m'ont l'air conformes

Ça au moins c'est une bonne nouvelle.

À signaler que des commandes sed qui passaient bien dans le Terminal
m'ont parfois causé des soucis (certains caractères non pris en compte,
mais je ne sais plus lesquels) quand encapsulées dans un "do shell
script" d'AS qui est le fautif.
Mais le bug est contournable par anticipation
--
J. B.