Bash удаляет все символы перед последними 2 символами «/» в переменной

Борясь. Пожалуйста помоги.

a="/var/www/test/some/page3.html"

Мне нужно преобразовать его в

a="some/page3.html"

я пытаюсь

a=$(sed "s~/var/www/test/~~g" $a)

Но получить результаты baaaad.

Всего 3 ответа


Разбор параметров Bash .
Нет необходимости запускать подпроцесс.

$: a="/var/www/test/some/page3.html"
$: echo "${a%/*/*}"      # the part you want to get rid of
/var/www/test
$: echo "${a#${a%/*/*}}" # strip that
/some/page3.html

Если вы хотите избавиться от этой ведущей косой черты ...

$: echo "${a#${a%/*/*}/}"
some/page3.html

a="/var/www/test/some/page3.html"
a=$(basename $(dirname "$a"))/$(basename "$a")
echo "$a"

Выход:

some/page3.html

Используйте это, если вы хотите напечатать последние 2 раздела пути:

$ a='/var/www/test/some/page3.html'
$ [[ $a =~ [^/]+/[^/]+$ ]] && a="${BASH_REMATCH[0]}"
$ echo "$a"
some/page3.html

Используйте это, если вы хотите удалить первые 3 раздела пути:

$ a="/var/www/test/some/page3.html"
$ [[ $a =~ ^(/[^/]+){3}/(.*) ]] && a="${BASH_REMATCH[2]}"
$ echo "$a"
some/page3.html

Идентификатор, который вы хотите сделать, поскольку оба подхода приведут к ожидаемому результату из этого одного примера ввода. Выберите, что вы хотите сделать, учитывая это:

 $ a="/foo/var/www/test/some/page3.html" $ [[ $a =~ [^/]+/[^/]+$ ]] && echo "${BASH_REMATCH[0]}" some/page3.html $ [[ $a =~ ^(/[^/]+){3}/(.*) ]] && echo "${BASH_REMATCH[2]}" test/some/page3.html 

Есть идеи?

10000