使用 sed 提取路径值子字符串

extract path value substring using sed

正在尝试在具有以下值的路径变量之间提取文本 path_value="path/to/value/src" 我只想从上面的变量中提取 value 并稍后在我的脚本中使用它。我知道可以使用 grepawk 来完成,但我想知道如何使用 sed

来完成

所以我尝试了这个 service_name=$(echo $path_value | sed -e 's/path/to/(.*\)/.*//') 但是我得到这个错误 bad flag in substitute command: '('

你能建议什么是正确的正则表达式来实现我想要做的事情吗?

您可以使用

#!/bin/bash
path_value="path/to/value/src"
service_name=$(echo "$path_value" | sed 's~path/to/\([^/]*\)/.*~~')
echo "$service_name"
# => value

参见online demo

请注意,我用 ~ 替换了 / 正则表达式定界符,以避免在模式中转义 / 个字符。

捕获括号必须在 POSIX BRE 正则表达式中进行转义。

[^/]* 部分只匹配 / 以外的零个或多个字符。

使用 parameter substitution 并消除子进程调用:

$ path_value="path/to/value/src"

$ tempx="${path_value%/*}"
$ echo "${tempx}"
path/to/value

$ service_name="${tempx##*/}"
$ echo "${service_name}"
value

执行 bash/regex 比较并从 BASH_REMATCH[] 数组中检索所需的项目(也消除了子进程调用):

$ regex='.*/([^/]+)/([^/]+)$'
$ [[ "${path_value}" =~ $regex ]] && service_name="${BASH_REMATCH[1]}"
$ echo "${service_name}"

# fwiw, contents of the BASH_REMATCH[] array:

$ typeset -p BASH_REMATCH
declare -ar BASH_REMATCH=([0]="path/to/value/src" [1]="value" [2]="src")