Regex bash中的链式字符串操作

Regex bash中的链式字符串操作,regex,string,bash,variables,Regex,String,Bash,Variables,给定变量 export TAG="1.3.2_release" 我想将变量转换为值132 我无法获取子字符串: bash-5.0$ echo ${TAG:0:5} > 1.3.2 我可以用空字符串替换点: bash-5.0$ echo ${TAG//./} > 132_release 但我不能将这两个操作合并到一行: bash-5.0$ echo ${${TAG:0:5}//./} > bash: ${${TAG:0:5}//./}: bad substitution

给定变量

export TAG="1.3.2_release"
我想将变量转换为值
132

我无法获取子字符串:

bash-5.0$ echo ${TAG:0:5}
> 1.3.2
我可以用空字符串替换点:

bash-5.0$ echo ${TAG//./}
> 132_release
但我不能将这两个操作合并到一行:

bash-5.0$ echo ${${TAG:0:5}//./}
> bash: ${${TAG:0:5}//./}: bad substitution

可以使用
cut
仅获取第一个
前面的部分,而不是获取特定长度的子字符串:

bash-5.0$ echo ${TAG//./} | cut -d'_' -f 1
> 132
这基本上比我想要的要好,因为现在版本名可以是可变长度的


我仍然想知道为什么我最初的尝试没有成功。

您可以使用以下扩展:

${TAG//[^0-9]/}

它从变量的值中删除所有非数字字符。

为什么不简单一点,创建一个临时变量,保存其中的第一个替换值,然后创建具有实际替换值的变量,如:

export TAG="1.3.2_release"
var="${TAG//./}"
echo "${var/_*/}"
既然我看到您尝试使用外部命令(我指的是bash之外的命令),那么为什么不也使用simple
awk

export TAG="1.3.2_release"
echo "$TAG" | awk -F'_' '{gsub(/\./,"",$1);print $1}'

谢谢你们两位的评论。我不确定这是否相同。在您提到的帖子中,查找的结果用于处理另一个变量。我不想那样做。我想使用查找的结果并对其进行进一步的操作。谢谢,我可能会这样做,我只是想知道为什么它不起作用,因为它在zsh中起作用。我猜这在巴什是不可能的,谢谢!我喜欢这样,因为我没有一个箱子,因为在
后面有一个数字work@Henning很高兴能帮上忙!