Bash嵌套子串删除(提取)?

时间:2018-01-24 19:52:11

标签: string bash substring

我在写作的脚本中有类似的内容:

CMD="/path/to/cmd,there.sh"
TMP="${CMD##*/}"
echo "${TMP%%,*}"

有没有办法在第2行和第2行中嵌套子串删除3,或者在单行中产生相同的结果,在纯粹的bash中,不用去另一个程序? $ {CMD}的长度不是静态的。要清楚,我希望输出只是" cmd"。

我已尝试使用以下各种形式的括号和引号,但出现语法错误。这是(我认为)被允许但在新版本的Bash中没有。

echo "${${CMD##*/}%%,*}"

4 个答案:

答案 0 :(得分:1)

不幸的是,不,它不可能在bash中组合或嵌套字符串操作。

答案 1 :(得分:1)

使用bash:

[[ $CMD =~ .*/([^,]*) ]] && echo ${BASH_REMATCH[1]}

答案 2 :(得分:0)

Shell参数替换是原始的,因为它们不提供嵌套等功能。但是,没有人阻止你在这里做sed事。

cmd="/path/to/cmd,there.sh" # Use lower-case identifiers for user variables
cmd=$(sed -E 's#^.*/([^,]+),.*$#\1#' <<<"$cmd")

<<<允许在bash中使用custom commands

答案 3 :(得分:0)

我发现zsh实际上支持嵌套字符串操作,所以我实际上将解释器切换为zsh for my script,以下工作正常:

echo "${${CMD##*/}%%,*}"