【问题标题】:Chained string manipulation in bash [duplicate]bash中的链式字符串操作[重复]
【发布时间】:2020-03-27 06:48:39
【问题描述】:

给定变量

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

【问题讨论】:

  • 感谢两位的评论。我不确定这是否相同。在您提到的帖子中,查找结果用于处理另一个变量。我不想那样做。我想使用查找的结果并对其进行进一步的操作。

标签: regex string bash variables


【解决方案1】:

您也许可以使用以下扩展:

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

它从变量的值中删除每个非数字字符。

【讨论】:

  • 谢谢!我喜欢这样,因为我没有一个案例是在_ 之后有一个数字,这将起作用
  • @Henning 很高兴能提供帮助!
【解决方案2】:

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

export TAG="1.3.2_release"
var="${TAG//./}"
echo "${var/_*/}"

既然我看到您尝试使用外部命令(我的意思是除了 bash 之外),那么为什么不简单 awk

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

【讨论】:

  • 谢谢,我可能会这样做,我只是想知道为什么它不起作用,因为它在 zsh 中起作用。猜测它在 bash 中是不可能的
【解决方案3】:

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

bash-5.0$ echo ${TAG//./} | cut -d'_' -f 1
> 132

这基本上比我想要的要好,因为现在版本名称可以是可变长度的。

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

【讨论】:

    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2020-09-13
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多