Bash 删除变量中最后 2 个“/”符号之前的所有符号

问题描述 投票:0回答:3

挣扎。请帮忙。

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

我需要将其转换为

a="some/page3.html"

我正在努力

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

但是得到了 baaaad 的结果。

bash variables sed
3个回答
5
投票

Bash 参数解析.
无需运行子进程。

如果您确切知道需要修剪什么 -

$: echo "${a#/var/www/test/}"
some/page3.html

如果您可能不知道确切的路径字符串,甚至不知道要去掉前面的多少个子目录,但确切知道要在后面保留多少子目录,请使用一个字符串解析来调整另一个字符串。

您可以在一个变量解析中获取您想要删除的部分 -

$: echo "${a%/*/*}"        # the part you want to get rid of
/var/www/test

所以用它来获得余数,全部在一行中。

$: echo "${a#${a%/*/*}/}"  # strip the above, and the next slash
some/page3.html

如果您更熟悉正则表达式,那么一行两步仍然很容易完成。

$: [[ "$a" =~ ([^/]+/[^/]+)$ ]] && echo "${BASH_REMATCH[1]}"
some/page3.html

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

输出:

一些/page3.html

1
投票

如果您想打印最后 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
© www.soinside.com 2019 - 2024. All rights reserved.