使用 sed 提取路径值子字符串
extract path value substring using sed
正在尝试在具有以下值的路径变量之间提取文本
path_value="path/to/value/src"
我只想从上面的变量中提取 value
并稍后在我的脚本中使用它。我知道可以使用 grep
或 awk
来完成,但我想知道如何使用 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")
正在尝试在具有以下值的路径变量之间提取文本
path_value="path/to/value/src"
我只想从上面的变量中提取 value
并稍后在我的脚本中使用它。我知道可以使用 grep
或 awk
来完成,但我想知道如何使用 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")