【问题标题】:Extract integer from string using bash使用bash从字符串中提取整数
【发布时间】:2011-06-17 15:24:23
【问题描述】:

我试图在这里找到解决方案,但找不到;给定字符串,如

ABC3
DFGSS34
CVBB3

如何提取整数以便得到

3
34
3

??

【问题讨论】:

    标签: string bash integer


    【解决方案1】:

    对于仅 bash 的解决方案,您可以使用参数模式替换:

    pax$ xyz=ABC3 ; echo ${xyz//[A-Z]/}
    3
    pax$ xyz=DFGSS34 ; echo ${xyz//[A-Z]/}
    34
    pax$ xyz=CVBB3 ; echo ${xyz//[A-Z]/}
    3
    

    它与sed 解决方案非常相似,但具有不必分叉另一个进程的优点。这对于小型工作可能并不重要,但我遇到过这样的情况:对文件的许多行执行此类操作,并且非分叉显着提高了速度。

    【讨论】:

    • 这没有考虑到给定字符串中可能有其他非字母数字字符,例如()[]{}#$!.等。不应该更好地阅读echo ${xyz//[^0-9]/}而不是提取“除了整数”?
    【解决方案2】:

    只需一个简单的 sed 命令即可完成工作:

    sed 's/[^0-9]//g' file.txt
    

    输出

    3
    34
    3
    

    【讨论】:

    • 小数的情况如:123.43 ?
    • 因为问题是提取整数,所以这就是答案。对于浮点,需要不同的解决方案。
    • 不宜在评论区回答新问题。如果您发布问题,那么我一定会尽力回答。
    【解决方案3】:

    tr怎么样?

    for s in ABC3 DFGSS34 CVBB3 ; do
        tr -cd 0-9 <<<"$s"
        echo
    done
    

    【讨论】:

      【解决方案4】:

      grep 版本呢?

      grep -o '[0-9]*' file.txt
      

      【讨论】:

      • grep -o '[0-9][0-9]*' file.txt
      • @Mahdi:对于 this 特定用例,这是不必要的。但总的来说你是对的。
      • 为什么不用 grep -o "[0-9]\+" 而不是 grep -o '[0-9][0-9]*'
      猜你喜欢
      • 1970-01-01
      • 2011-04-03
      • 2019-02-21
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多