803 votes

Supprimer un préfixe/suffixe fixe d'une chaîne de caractères en Bash

Dans mon bash script J'ai une chaîne de caractères et son préfixe/suffixe. J'ai besoin de supprimer le préfixe/suffixe de la chaîne originale.

Par exemple, disons que j'ai les valeurs suivantes :

string="hello-world"
prefix="hell"
suffix="ld"

Comment arriver au résultat suivant ?

result="o-wor"

5 votes

Jetez un coup d'œil Guide avancé des scripts Bash

26 votes

Méfiez-vous des liens vers le soi-disant Guide avancé des scripts Bash ; il contient un mélange de bons et de mauvais conseils.

10voto

Tosi Do Points 83

Solution petite et universelle :

expr "$string" : "$prefix\(.*\)$suffix"

1 votes

Si vous utilisez Bash, vous ne devriez probablement pas utiliser expr du tout. C'était un en quelque sorte Un utilitaire pratique pour l'évier de cuisine à l'époque du shell Bourne original, mais qui a maintenant dépassé sa date de péremption.

1 votes

Euh, pourquoi ? expr est vieux, mais ne change jamais, et sera probablement toujours disponible. Tant que vous invoquez un binaire externe (par opposition à l'utilisation d'expressions BASH), grep, sed ou expr sont à peu près équivalents (perl / awk serait plus coûteux).

10voto

Utilisation de la =~ opérateur :

$ string="hello-world"
$ prefix="hell"
$ suffix="ld"
$ [[ "$string" =~ ^$prefix(.*)$suffix$ ]] && echo "${BASH_REMATCH[1]}"
o-wor

6voto

math2001 Points 1744

En utilisant la réponse de @Adrian Frühwirth :

function strip {
    local STRING=${1#$"$2"}
    echo ${STRING%$"$2"}
}

utilisez-le comme ceci

HELLO=":hello:"
HELLO=$(strip "$HELLO" ":")
echo $HELLO # hello

0voto

Bayou Points 108

J'utiliserais les groupes de capture en regex :

$ string="hello-world"
$ prefix="hell"
$ suffix="ld"
$ set +H # Disables history substitution, can be omitted in scripts.
$ perl -pe "s/${prefix}((?:(?!(${suffix})).)*)${suffix}/\1/" <<< $string
o-wor
$ string1=$string$string
$ perl -pe "s/${prefix}((?:(?!(${suffix})).)*)${suffix}/\1/g" <<< $string1
o-woro-wor

((?:(?!(${suffix})).)*) s'assure que le contenu de ${suffix} seront exclus du groupe de capture. En termes d'exemple, c'est l'équivalent en chaîne de caractères de [^A-Z]* . Sinon, vous obtiendrez :

$ perl -pe "s/${prefix}(.*)${suffix}/\1/g" <<< $string1
o-worldhello-wor

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X