如何在正则表达式模式后直接找到最高整数?

时间:2018-05-12 01:14:07

标签: regex bash awk

我正在编写一个bash脚本,该脚本将以1开头的所有版本号开头,其中包含10以上的subversion。它从RSS页面获取并使用awk grep和a的组合在新行上打印它们正则表达式。

curl -v --silent https://website.com.rss 2>&1 | awk -F '<title>|<\/title>' '{print $2}' | grep "^1\.[0-9][0-9]\."

上面的命令产生:

1.10.1
1.10.2
1.10.3
1.11.1
1.11.2
1.11.4

我试图让输出只显示每个子版本的最高子子版本。例如,从上面的输出我想只得到:

1.10.3
1.11.4

因为它们都是相应子版本的最新版本。

我不确定如何实现这一目标,或者甚至可能。我假设我需要一个循环来查看每个可能的另一个正则表达式,但我很难过。有什么建议吗?

4 个答案:

答案 0 :(得分:4)

在awk中(使用@ sergio的数据):

$ awk '
BEGIN{FS=OFS="."}
$3 > a[$1 "." $2] { 
    a[$1 "." $2]=$3
}
END {
    for(i in a) 
        print i,a[i]
}' file
1.10.3                                                                          
1.11.4                                                                          
1.12.13                                                                         
1.13.4 

输出顺序是awk for默认值,即。似乎是随机的。

答案 1 :(得分:1)

您可以将命令的输出保存在文件中(例如inputfile.txt)。例如:

1.10.1                                                                          
1.11.1                                                                          
1.11.2                                                                          
1.10.3                                                                          
1.13.2                                                                          
1.12.3                                                                          
1.11.4                                                                          
1.12.3                                                                          
1.12.1                                                                          
1.12.13                                                                         
1.10.2                                                                          
1.13.1                                                                          
1.13.4 

然后使用以下脚本:

#!/usr/bin/env bash

max=0                                                                           
i=0                                                                             
lines=($(sort -t. -n -k1,1 -k2,2 -k3,3 inputfile.txt))                         
version=${lines[0]/??/}                                                         
version=${version/.*/}                                                          
for line in ${lines[@]}; do                                                     
    tmp=${line/??/}                                                
    tmp=${tmp/.*/}                                                              
    if [ $tmp -eq $version ]; then                                              
        if (( ${line//./} > $max )); then                                       
            max=${line//./}                                                     
        fi                                                                      
    else                                                                        
        echo ${lines[i-1]}                                                      
    fi                                                                          
    version=$tmp                                                                
    ((i++))                                                                     
done                                                                            
echo $line                                                                      

这将输出每个子版本的最高子子版本:

1.10.3                                                                                  
1.11.4                                                                                  
1.12.13                                                                                 
1.13.4   

我假设每行以一个数字后跟一个点开头。如果不是这种情况(例如11.10.1),则需要修改行tmp=${line/??/}

答案 2 :(得分:1)

你不需要用管道输送到另一个awk的管道 - 只需1个awk命令即可:

awk -F '</?title>' '
{
    split($2,f,/[.]/)
    ver       = f[1]
    subVer    = f[2]
    subSubVer = f[3]
}
(ver == 1) && (subVer >= 10) {
    key = ver "." subVer
    maxSsv[key] = (subSubVer > maxSsv[key] ? subSubVer : maxSsv[key])
}
END {
    for (key in maxSsv) {
        print key "." maxSsv[key]
    }
}
'

答案 3 :(得分:-1)

如果您想使用正则表达式,那么:

function arrayManipulation(n, queries) {

  var array = new Array(n).fill(0)
  var x = 0
  var recurring = (argmnt, query) => {

    //problem start here
    var start = query[0],
      end = query[1]
    //problem end somewhere else

    var newArg = argmnt.map((el, index) => {
      if (index + 1 >= start && index + 1 <= end) {
        return query[2] + el
      } else {
        return el
      }
    })
    console.log(newArg)
    x += 1
    if (x < queries.length) {
      recurring(newArg, queries[x], x)
    } else {
      return newArg
    }
  }

  var solution = recurring(array, queries[x])
}

arrayManipulation(5, [
  [1, 2, 100],
  [2, 5, 100],
  [3, 4, 100]
])

其中inputfile.txt包含版本号的行。