Удалите шаблон соответствия подстроки как в начале, так и в конце переменной

Как говорится в названии, я ищу способ удалить определенный шаблон как в начале переменной, так и в конце. Я знаю, что мне нужно использовать # и % но я не знаю правильного синтаксиса.

В этом случае я хочу удалить http:// в начале и /score/ в конце $line variable, которая считывается из file.txt.

Ответ 1

Ну, вы не можете вложить ${var%}/${var#} операции, поэтому вам придется использовать временную переменную.

Как здесь:

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

Кроме того, вы можете использовать регулярные выражения с (например) sed:

some_variable="$( echo "$var" | sed -e 's#^http://##; s#/score/$##' )"

Ответ 2

$ 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

Ответ 3

Вы должны сделать это за 2 шага:

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

Ответ 4

Есть способ сделать это одним шагом, используя только встроенную функциональность bash (без запуска внешних программ, таких как sed) - с BASH_REMATCH:

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

Это совпадает с регулярным выражением в правой части теста =~ и помещает группы в массив BASH_REMATCH.


Тем не менее, более условно использовать два выражения PE и временную переменную:

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

... в приведенном выше примере опция extglob используется, чтобы позволить оболочке распознавать "extglobs" - расширения bash для синтаксиса glob (что делает шаблоны стиля glob похожими на правильные выражения), среди которых ?(foo) означает что foo является необязательным.


Кстати, я использую printf а не echo в этих примерах, потому что многие из поведения echo определены по реализации, например, рассмотрим случай, когда содержимое переменной -e или -n.

Ответ 5

как насчет

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