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
.
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/$##' )"
$ 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
Vous devez le faire en 2 étapes:
$ string="fooSTUFFfoo"
$ string="${string%foo}"
$ string="${string#foo}"
$ echo "$string"
STUFF
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
.
que diriez-vous
export x='https://www.google.com/keep/score';
var=$(Perl -e 'if ( $ENV{x} =~ /(https:\/\/)(.+)(\/score)/ ) { print qq($2);}')