Как найти наибольшее целое число непосредственно после шаблона регулярного выражения? - PullRequest
0 голосов
/ 12 мая 2018

Я пишу bash-скрипт, который будет проверять все номера версий, начиная с 1. с подрывной версией выше 10. Он получает это со страницы RSS и печатает их в новой строке, используя комбинацию awk grep и regex.

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 голосов
/ 12 мая 2018

Вам не нужен awk, отправленный по каналу grep, переданному другому 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]
    }
}
'
0 голосов
/ 12 мая 2018

В 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, т.е.появляется случайным образом.

0 голосов
/ 12 мая 2018

Если вы хотите использовать регулярные выражения, как насчет:

#!/bin/bash

declare -A max

while read -r line; do
    if [[ "$line" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+) ]]; then
        sub=${BASH_REMATCH[2]}
        subsub=${BASH_REMATCH[3]}
        if [[ -z "${max[$sub]}" || ${max[$sub]} -lt $subsub ]]; then
            max[$sub]=$subsub
        fi
    fi
done < inputfile.txt

for sub in ${!max[@]}; do
    printf "%d.%d.%d\n" 1 $sub ${max[$sub]}
done

, где inputfile.txt содержит строки различных чисел.

0 голосов
/ 12 мая 2018

Вы можете сохранить вывод вашей команды в файл (например, 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   

IПредполагается, что каждая строка начинается с одной цифры, за которой следует точка.Если это не так (например, 11.10.1), то строку tmp=${line/??/} необходимо изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...