bash shell重做变量用下划线替换点

时间:2019-03-03 01:12:10

标签: bash shell scripting

我看不到它能正常工作:

echo $VERSIONNUMBER

我得到了:v0.9.3-beta

VERSIONNUMBERNAME=${VERSIONNUMBER:1}
echo $VERSIONNUMBERNAME

我得到:0.9.3-beta

VERSION=${VERSIONNUMBERNAME/./_}
echo $VERSION

我得到了:0_9.3-beta

我想要拥有:0_9_3-beta

我一直在搜寻我的大脑,我无法做出决定。

理想情况下,我想删除v并在一行中用下划线替换句点。

2 个答案:

答案 0 :(得分:4)

让我们创建您的变量:

$ VERSIONNUMBER=v0.9.3-beta
$ VERSIONNUMBERNAME=${VERSIONNUMBER:1}

此表单仅替换第一次出现的.

$ echo "${VERSIONNUMBERNAME/./_}"
0_9.3-beta

要替换所有出现的.,请使用:

$ echo "${VERSIONNUMBERNAME//./_}"
0_9_3-beta

由于此方法避免了创建管道和子shell以及避免使用外部可执行文件,因此该方法非常有效。这种方法也是Unicode安全的。

文档

来自man bash

  

$ {parameter / pattern / string}

     

模式替换。扩展模式以生成模式   就像在路径名扩展中一样。参数扩展且最长   模式与其值的匹配被替换为   串。 如果模式以/开头,则所有匹配的模式都将被替换    通常只替换第一个匹配项。   模式以#开头,必须与扩展的开头匹配   参数值。如果格式以%开头,则它必须与   参数扩展值的结尾。如果字符串   为null,将删除模式的匹配项,并且/以下模式   可以省略。如果启用了nocasematch shell选项,则   匹配不考虑字母大小写   字符。如果参数为@或*,则替换操作为   依次应用于每个位置参数,   扩展是结果列表。如果parameter是数组变量   用@或*下标,替换操作为   依次应用于数组的每个成员,展开是   结果列表。   (添加了强调。)

答案 1 :(得分:1)

您可以将模式替换与tr结合使用:

VERSION=$( echo ${VERSIONNUMBER:1} | tr '.' '_' )