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

Remplacement de Bash-ismes par du POSIX ?

1 réponse
Avatar
PIGUET Bruno
Bonjour,

Dans un script, j'ai une chaîne qui se termine éventuellement par un
caractère "_" et des chiffres, et je veux supprimer ce postfixe.

Avec bash et le mode extglob (shopt -s extglob), j'y arrive par :
racine_nom=${1%%_*([0-9])}

Evidement, ça ne marche pas sans le mode "extglob". Un lecteur de ce
groupe aurait-il une piste pour m'orienter vers qqchose de plus
portable ?

Les pistes déjà envisagées :
- Je sais que perl, python, rexx, ${votre_langage_de_script_prefere}
pourraient être des solutions, mais je préférerais rester en shell.
- J'imagine qu'il y a moyen de faire qqchose avec sed (
echo $1 | sed -e 's/_[0-9]*$//' ), mais si je peux éviter de faire
appel à un programme externe, ce serait mieux.

Merci d'avance pour vos suggestions,

Bruno.

1 réponse

Avatar
Stephane CHAZELAS
2009-04-6, 09:31(+00), PIGUET Bruno:
Bonjour,

Dans un script, j'ai une chaîne qui se termine éventuellement par un
caractère "_" et des chiffres, et je veux supprimer ce postfixe.

Avec bash et le mode extglob (shopt -s extglob), j'y arrive par :
racine_nom=${1%%_*([0-9])}

Evidement, ça ne marche pas sans le mode "extglob". Un lecteur de ce
groupe aurait-il une piste pour m'orienter vers qqchose de plus
portable ?


[...]

case ${1##*_} in
(*[!0-9]*) ;;
(*) racine_nom=${1%_*}
esac

Ou (pour etre Bourne-compatible)::

tmp=`expr "x$1" : "x(.*)_[0-9]*$"`
if [ "x$1" = "$tmp" ]; then
racine_nom=$1
else
racine_nom=$tmp
fi

Mais ca ne marche pas si $1 se termine par des sauts de ligne.

--
Stéphane