挣扎。请帮忙。
a="/var/www/test/some/page3.html"
我需要将其转换为
a="some/page3.html"
我正在努力
a=$(sed "s~/var/www/test/~~g" $a)
但是得到了 baaaad 的结果。
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
a="/var/www/test/some/page3.html"
a=$(basename $(dirname "$a"))/$(basename "$a")
echo "$a"
输出:
一些/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
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