Удалите шаблон соответствия подстроки как в начале, так и в конце переменной
Как говорится в названии, я ищу способ удалить определенный шаблон как в начале переменной, так и в конце. Я знаю, что мне нужно использовать #
и %
но я не знаю правильного синтаксиса.
В этом случае я хочу удалить 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);}')