web-dev-qa-db-fra.com

Supprimer le modèle de correspondance de sous-chaîne au début et à la fin de la variable

Comme le titre l'indique, je cherche un moyen de supprimer un motif défini à la fois au début et à la fin d'une variable. Je sais que je dois utiliser # et % mais je ne connais pas la syntaxe correcte.

Dans ce cas, je veux supprimer http:// au début et /score/ à la fin de la variable $line qui est lue à partir de file.txt.

18
bobylapointe

Eh bien, vous ne pouvez pas imbriquer les opérations ${var%}/${var#};.

Comme ici:

var="http://whatever/score/"
temp_var="${var#http://}"
echo "${temp_var%/score/}"

Alternativement, vous pouvez utiliser des expressions régulières avec (par exemple) sed:

some_variable="$( echo "$var" | sed -e 's#^http://##; s#/score/$##' )"
20
user80168
$ var='https://www.google.com/keep/score'
$ var=${var#*//} #removes stuff upto // from begining
$ var=${var%/*} #removes stuff from / all the way to end
$ echo $var
www.google.com/keep
6
jaypal singh

Vous devez le faire en 2 étapes:

$ string="fooSTUFFfoo"
$ string="${string%foo}"
$ string="${string#foo}"
$ echo "$string"
STUFF
2
Gilles Quenot

Il y a IS moyen de le faire en une étape en utilisant uniquement la fonctionnalité bash intégrée (aucun programme externe en cours d'exécution tel que sed) - avec BASH_REMATCH:

url=http://whatever/score/
re='https?://(.*)/score/'
[[ $url =~ $re ]] && printf '%s\n' "${BASH_REMATCH[1]}"

Cela correspond à l'expression régulière située à droite du test =~ et place les groupes dans le tableau BASH_REMATCH.


Cela dit, il est plus conventionnel d’utiliser deux expressions PE et une variable temporaire:

shopt -s extglob
url=http://whatever/score/
val=${url#http?(s)://}; val=${val%/score/}
printf '%s\n' "$val"

... dans l'exemple ci-dessus, l'option extglob est utilisée pour permettre au Shell de reconnaître les "extglobs" - les extensions de bash à la syntaxe glob de bash (rendant les modèles de style glob similaires en puissance aux expressions régulières), parmi lesquelles ?(foo) signifie que foo est optionnel.


En passant, j’utilise printf plutôt que echo dans ces exemples car de nombreux comportements de echo sont définis par l’implémentation. Par exemple, considérons le cas où le contenu de la variable est -e ou -n.

2
Charles Duffy

que diriez-vous 

export x='https://www.google.com/keep/score';
var=$(Perl -e 'if ( $ENV{x} =~ /(https:\/\/)(.+)(\/score)/ ) { print qq($2);}')
0
michael501