【问题标题】:Regex pattern help wanted需要正则表达式模式帮助
【发布时间】:2014-07-26 05:16:01
【问题描述】:

我有一条具有以下模式的行:

A:B=2, G:E=3, N:M=1
AA:BB=20, DG:EE=30 ;;sssddd;; WN:FFM=10
A:dB=200 ssss G:EASD=300 hellp SSASDN:FFFM=100

我想将所有数字相加

输出应该是

2+3+1 = 6

20+30+10 = 60

200+300+100 = 600

然后我可以使用 | bc -q 求和

【问题讨论】:

  • 正则表达式不做算术。您必须使用纯代码来添加它们。不过,您可以使用正则表达式来查找数字。
  • 我在考虑把数字变成“2+3+1” | bc wchih 将返回 6 结果

标签: regex linux sed grep


【解决方案1】:

这是一种使用awk的方法

awk -F"[^[:digit:].]*" '{t=0;for (i=1;i<=NF;i++) t+=$i;print t}'
6
60
600

所有不是数字的都设置为字段分隔符

这个FS 也应该可以工作:-F"[=,]"

【讨论】:

    【解决方案2】:
    sed -r 's/[^0-9 ]//g;s/ +/+/g'
    

    输出:

    2+3+1
    20+30+10
    200+300+100
    

    sed -r 's/[^0-9 ]//g;s/ +/+/g' | bc
    

    输出:

    6
    60
    600
    

    【讨论】:

      【解决方案3】:

      其中一个应该做你真正想做的任何事情:

      $ awk -F'=' -v OFS='+' '{for (i=2;i<=NF;i++) printf "%s%s", $i+0, (i<NF?OFS:ORS)}' file
      2+3+1
      20+30+10
      200+300+100
      
      $ awk -F'=' -v OFS='+' '{sum=0; for (i=2;i<=NF;i++) { sum+=$i; printf "%s%s", $i+0, (i<NF?OFS:"=" sum ORS)} }' file
      2+3+1=6
      20+30+10=60
      200+300+100=600
      
      $ awk -F'=' '{sum=0; for (i=2;i<=NF;i++) sum+=$i; print sum}' file
      6
      60
      600
      

      【讨论】:

        猜你喜欢
        • 2012-11-30
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多