Bash удаляет все символы перед последними 2 "/" символами в переменной - PullRequest
0 голосов
/ 16 мая 2019

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

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

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

a="some/page3.html"

Я пытаюсь

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

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

Ответы [ 3 ]

5 голосов
/ 16 мая 2019

Разбор параметров 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
2 голосов
/ 16 мая 2019

Используйте это, если вы хотите напечатать последние 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

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

$ 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
1 голос
/ 16 мая 2019
a="/var/www/test/some/page3.html"
a=$(basename $(dirname "$a"))/$(basename "$a")
echo "$a"

Выход:

some/page3.html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...