LINUX.ORG.RU

Bash, как из строки выделить наибольшее число


0

0

Чтото не могу придумать человеческого способа решения задачи.
Есть строка «01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 ABBA_Ring_Ringhtml cut testsh testsh~ Текст»
Из не нужно выделить наибольшее число, тоесть 15.
Как это сделать по человечески?


Ответ на: комментарий от dmitry_vk

Чет у меня не получается
sed 's/^.\{4\}//'

удаляет первые 4 символа, а sed 's/$.\{4\}//'
должна удалаять последние 4?

А что тогда не так?

Frolic
() автор топика
Ответ на: комментарий от Frolic

а sed 's/$.\{4\}//' должна удалаять последние 4?

's/.\{4\}$//'

GotF ★★★★★
()
Ответ на: комментарий от Frolic

> Чет у меня не получается

sed 's/^.\{4\}//'


удаляет первые 4 символа, а sed 's/$.\{4\}//'

должна удалаять последние 4?



Что ж вы так не любите все читать документацию-то, a?

AnDoR ★★★★★
()
Ответ на: комментарий от sdio

Такое обязательно требует на входе хотя бы одно число, а если на входе одни строки, то даст строку.

mky ★★★★★
()
Ответ на: комментарий от mky

Вообще-то ТС просил на чистом баше :-)

#!/bin/bash

INP="01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 ABBA_Ring_Ringhtml cut testsh testsh~ Текст"

max=-1
for w in $INP; do
    if [[ $w =~ ^[0-9]+$ ]]; then
        if [ $w -gt $max ]; then
            max=$w
        fi
    fi
done

echo $max
sdio ★★★★★
()
Ответ на: комментарий от Frolic

Frolic> А я хотел через циклы, получилось бы гораздо хуже.

На чистом баше без вызова внешних программ (grep, sort, tail) работает на порядок быстрее.

sdio ★★★★★
()
Ответ на: комментарий от sdio

Я бы упростил:

#!/bin/bash

INP="01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 ABBA_Ring_Ringhtml cut testsh testsh~ Текст" 
 
max=-1 
for w in $INP; do 
    if [ $w -gt $max ] 2>/dev/null; then 
         max=$w 
    fi 
done 
 
echo $max

Забавно, что если во входной строке будет, допустим 099, то всё работает корректно, а вот если при этом сделать «echo $(( max + 0 ))», то будет ругань.

И, надо бы, усложнить, чтобы при отсутсвии чисел, было сообщение об ошибке, а не «max=-1».

mky ★★★★★
()
Ответ на: комментарий от sdio

>>получилось бы гораздо хуже

работает на порядок быстрее.

Думаю, что с учётом «sed 's/$.\{4\}//'» топикстартер реально оценил то, что получилось бы у него :)

mky ★★★★★
()
Ответ на: комментарий от mky

Упросченный вариант работает существенно быстрее чем первоначальный.
real 0m0.003s и real 0m0.154s.
Если бы еще с интернета так же быстро скачивалось.
Вообще скрипт пшу для скачивания текстов с lyrics.wikia.com
Осталось самое интересное, почистить html.

Frolic
() автор топика
Ответ на: комментарий от mky

mky> 099

Оно воспринимается как восьмеричное число в [[ ]] и в арифм. операциях $[ ]

Для надежности наверное стоит писать:

if [[ 10#$NUM1 -gt 10#$NUM2 ]]; then

sdio ★★★★★
()
Ответ на: комментарий от Zenom

это не совсем то, что вы предлагали)
регэкспы есть встроенные в баше, есть в перле и много где еще. но бед дополнительной обработки (коей является «grep -o») ни один регэксп на решение поставленной задачи не способен.

xydo ★★
()
Ответ на: комментарий от xydo

Ну, тут, видимо, моя лень вызвала непонимание. Следовало бы сказать более развёрнуто: «Для выделения чисел из строки я бы использовал регэкспы, а задача выбора максимального из них тривиальна».

Zenom ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.