【问题标题】:Parsing String Variable in Bash Script在 Bash 脚本中解析字符串变量
【发布时间】:2015-09-04 10:14:06
【问题描述】:

我正在编写一个 bash 脚本,该脚本将解析一个完整的字符串名称,以便为我提供固件值。 例如,原始字符串名称将类似于:

Example_v0p1

期望的输出:

0.1

我的函数的第一部分根据下划线值分隔字符串,并将数组的第二个元素设置为一个名为版本的变量:

arr=(`echo $1| tr '_' ' '`)
version=${arr[1]}

使用我提供的示例,$version 现在等于“v0p1”。我正在寻找一种方法来进一步解析这个字符串,以便它看起来像所需的输出。

如果可能的话,我希望解决方案能够处理相同格式的多个变体,以便我可以对所有可能生成的版本代码使用相同的脚本。然而,语法总是相同的。 v#p#{p#p#....} 例子:

v0p1p1
v3p2p0p1
v1p3

期望的输出:

0.1.1 
3.2.0.1
1.3 

我不确定解决此问题的最佳方法。我对 REGEX 的经验不足以完成此操作,并且我无法想出合适的方法来解析字符串,因为它们的长度会不同。

【问题讨论】:

    标签: string bash shell parsing delimiter


    【解决方案1】:

    使用参数扩展:

    #!/bin/bash
    for v in v0p1p1 v3p2p0p1 v1p3 ; do
        v=${v//[vp]/.}             # Replace v's and p's with dots.
        v=${v#.}                   # Remove the leading dot.
        echo "$v"
    done
    

    【讨论】:

    • 如果我的解释让您感到困惑,我很抱歉。您声明为“v”的内容实际上是三个单独的字符串。我只是不确定如何在块中显示它
    • @StephenWeaver:对于单个字符串,您可以跳过第二次替换。我更新了答案。
    • 这也很好,感谢您抽出宝贵时间提供帮助。
    • @StephenWeaver,我建议这个答案作为公认的答案——如果你把它放在一个紧密的循环中,你会发现它的性能很远,far比向sed 发炮要好。
    • @CharlesDuffy 我很感谢 choroba 花费的时间来帮助我;但是,我没有选择这个作为最佳答案,因为我不需要循环。 anubhava 为我提供了我想要的东西。适用于每个实例的简单解决方案。我只需要脚本来处理一个变量。对于他提出的问题,他的回答更容易接受,这根本不是我的特殊问题。
    【解决方案2】:

    你可以这样做:

    s='v3p2p0p1'
    ver=$(sed 's/p/./g' <<< "${s:1}")
    
    echo "$ver"
    3.2.0.1
    
    s='v0p1p1'
    ver=$(sed 's/p/./g' <<< "${s:1}")
    
    echo "$ver"
    0.1.1
    

    【讨论】:

    • 如果你不介意的话,你能解释一下上面写着&lt;&lt;&lt; "${s:1}" 的那篇文章
    • &lt;&lt;&lt; 在此处被称为字符串,以将一些值提供给 sed 命令。
    • 我需要将输出存储到变量中,而不是回显
    • 检查更新的答案以将派生版本存储在变量中。
    • 非常感谢您的帮助。这正是我所需要的。比我原来的方法好多了。
    【解决方案3】:

    这将起作用:

    var="$(echo "v0p1p1" | tr -s 'vp' " .")"
    

    它用空格替换了v

    如果你不想这样做,你可以这样做:

    var=$(echo "v0p1p1" | tr -d 'v' | tr -s 'p' '.')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2015-12-18
      • 2015-03-29
      • 2018-11-08
      相关资源
      最近更新 更多