代码之家  ›  专栏  ›  技术社区  ›  tatsu

bash shell返工变量用下划线替换点

  •  1
  • tatsu  · 技术社区  · 7 年前

    我看不出它是否能正常工作:

    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并在一行中用下划线替换句点。

    1 回复  |  直到 7 年前
        1
  •  8
  •   Jack    7 年前

    您可以将模式替换与 tr :

    VERSION=$( echo ${VERSIONNUMBER:1} | tr '.' '_' ) 
    
        2
  •  8
  •   John1024 David C. Rankin    7 年前

    $ 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}

    模式替换。 就像在路径名扩展中一样。参数已展开,并且最长 一串 如果模式以/开头,则替换模式的所有匹配项 通常只替换第一个匹配项。 如果 模式以#开头,它必须在展开模式的开头匹配 参数的值。如果模式以%开头,则必须在 参数的展开值结束。如果字符串 为空,则删除模式的匹配项,并删除/以下模式 可以省略。如果启用了nocasematch shell选项,则 执行匹配时不考虑字母大小写 人物。如果参数为@或*,则替换操作为 依次应用于每个位置参数,并且 展开是结果列表。If参数是数组变量 结果列表。 (重点加上。)