From f0edff697b74d75d9518aa1cd897597a82a2d91a Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Fri, 19 Sep 2014 12:43:20 +0400 Subject: [PATCH] nouvelles fonctions str* --- lib/ulib/.ulibver | 2 +- lib/ulib/base | 2 +- lib/ulib/base.compat | 24 ++++++++++ lib/ulib/base.string | 111 +++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 133 insertions(+), 6 deletions(-) diff --git a/lib/ulib/.ulibver b/lib/ulib/.ulibver index 102c912..4382770 100644 --- a/lib/ulib/.ulibver +++ b/lib/ulib/.ulibver @@ -1 +1 @@ -003000002 +003001000 diff --git a/lib/ulib/base b/lib/ulib/base index 7f80834..2091cbb 100644 --- a/lib/ulib/base +++ b/lib/ulib/base @@ -206,7 +206,7 @@ function first_char() { } function last_char() { # retourner le dernier caractère de la chaine $1 - rawecho "${1:$((-1)):1}" + rawecho "${1: -1:1}" } function first_chars() { # retourner tous les caractères de la chaine $1, excepté le dernier diff --git a/lib/ulib/base.compat b/lib/ulib/base.compat index 7efc528..eb7ae66 100644 --- a/lib/ulib/base.compat +++ b/lib/ulib/base.compat @@ -7,7 +7,31 @@ urequire base.string if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then if uprovided base.string; then function strlower() { tr A-Z a-z <<<"$*"; } + function strlower1() { + local str="$*" + local h="${str:0:1}" r="${str:1}" + echo "$(tr A-Z a-z <<<"$h")$r" + } + function strlowers() { + local -a vs; local v + for v in "$@"; do + vs=("${vs[@]}" "$(strlower1 "$v")") + done + echo "${vs[*]}" + } function strupper() { tr a-z A-Z <<<"$*"; } + function strupper1() { + local str="$*" + local h="${str:0:1}" r="${str:1}" + echo "$(tr a-z A-Z <<<"$h")$r" + } + function struppers() { + local -a vs; local v + for v in "$@"; do + vs=("${vs[@]}" "$(strupper1 "$v")") + done + echo "${vs[*]}" + } function is_yes() { case "$1" in o|oui|y|yes|v|vrai|t|true|on) return 0;; diff --git a/lib/ulib/base.string b/lib/ulib/base.string index 5ea57a4..39c6287 100644 --- a/lib/ulib/base.string +++ b/lib/ulib/base.string @@ -1,16 +1,119 @@ ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ## Fonctions de base: gestion des valeurs scalaires ##@cooked nocomments +# Note: contient du code spécifique à bash 4. Le module base.compat réimplémente +# les fonctions concernées pour les rendre compatible avec bash >= 2.x uprovide base.string urequire base.core +function straddp() { +# ajouter le préfixe $1 à $2* + local p="$1"; shift + echo "$p$*" +} +function strdelp() { +# enlever le préfixe $1 à $2* + local p="$1"; shift + local str="$*" + echo "${str#$p}" +} +function strdelp2() { +# enlever le préfixe $1 le plus long à $2* + local p="$1"; shift + local str="$*" + echo "${str##$p}" +} +function stradds() { +# ajouter le suffixe $1 à $2* + local s="$1"; shift + echo "$*$s" +} +function strdels() { +# enlever le suffixe $1 à $2* + local s="$1"; shift + local str="$*" + echo "${str%$s}" +} +function strdels2() { +# enlever le suffixe le plus long $1 à $2* + local s="$1"; shift + local str="$*" + echo "${str%%$s}" +} function strlower() { -# afficher en minuscule la valeur $1..* - echo ${*,,} +# afficher en minuscule la valeur $* + local str="$*" + echo "${str,,}" +} +function strlower1() { +# afficher la valeur $* après avoir converti la première lettre en minuscule + local str="$*" + echo "${str,}" +} +function strlowers() { +# afficher les valeurs $1..* après avoir converti leur première lettre en +# minuscule + local str="$*" + echo "${*,}" } function strupper() { -# afficher en majuscule la valeur $1..* - echo ${*^^} +# afficher en majuscule la valeur $* + local str="$*" + echo "${str^^}" +} +function strupper1() { +# afficher la valeur $* après avoir converti la première lettre en majuscule + local str="$*" + echo "${str^}" +} +function struppers() { +# afficher les valeurs $1..* après avoir converti leur première lettre en +# majuscule + echo "${*^}" +} +function strmid() { +# Afficher la plage $1 de la valeur $2*. La plage peut être d'une des formes +# 'start', '[start]:length'. Si start est négatif, le compte est effectué à +# partir de la fin de la chaine. Si length est négatif, il est rajouté à la +# longueur de la chaine à partir de start + local range="$1"; shift + local str="$*" + if [[ "$range" == *:-* ]]; then + local max=${#str} + [ $max -eq 0 ] && return + local start="${range%%:*}" + [ -n "$start" ] || start=0 + while [ "$start" -lt 0 ]; do + start=$(($max$start)) + done + max=$(($max-$start)) + local length="${range#*:}" + while [ "$length" -lt 0 ]; do + length=$(($max$length)) + done + range="$start:$length" + fi + eval 'echo "${str:'" $range"'}"' +} +function strrepl() { +# Remplacer dans la valeur $3* le motif $1 par la chaine $2. $1 peut commencer +# par l'un des caractères /, #, % pour indiquer le type de recherche + local pattern="$1"; shift + local repl="$1"; shift + local str="$*" + local cmd='echo "${str/' + if [ "${pattern#/}" != "$pattern" ]; then + pattern="${pattern#/}" + cmd="$cmd/" + elif [ "${pattern#\#}" != "$pattern" ]; then + pattern="${pattern#\#}" + cmd="$cmd#" + elif [ "${pattern#%}" != "$pattern" ]; then + pattern="${pattern#%}" + cmd="$cmd%" + fi + cmd="$cmd"'$pattern/$repl}"' + eval "$cmd" } function isnum() { # retourner vrai si $1 est une valeur numérique entière (positive ou négative)