我看不到它能正常工作:
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并在一行中用下划线替换句点。
答案 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 '.' '_' )