Я считаю , что вы можете сделать это только с grep
, sort
и tail
как хорошо. Вот несколько примеров строк.
$ echo <str> | grep -oP "\d+" | sort -n | tail -1
Где <str>
наша строка под вопросом.
пример
$ set -o posix; set | grep "str[0-9]"
str0=212334123434test233
str1=212334123434test233abc44
str2=233test212334123434
str3=a212334123434test233abc44
str4=a91234b212334123434abc
Теперь, если я проведу их через свою grep ...
команду по очереди.
$ echo $str0 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str1 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str2 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str3 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str4 | grep -oP "\d+" | sort -n | tail -1
212334123434
Этот подход работает путем выбора всех подстрок, которые являются последовательностями цифр. Затем мы сортируем эти выходные данные численно, sort -n
а затем берем последнее значение в списке, используя tail -1
. Это будет самая длинная подстрока.
Вы можете увидеть, как это работает, взяв tail -1
и повторно запустив один из примеров:
$ echo $str4 | grep -oP "\d+" | sort -n
91234
212334123434
Строки, начинающиеся с нулей
Вышеупомянутый подход работает для любой ситуации, которую я мог себе представить, кроме одной. @terdon упомянул в чате этот сценарий, который мешает вышеуказанному подходу.
Таким образом, чтобы справиться с этим, вам нужно немного изменить тактику. Ядро вышеупомянутого подхода все еще можно использовать, однако нам нужно также ввести количество символов в результаты. Это дает возможность сортировки результатов по количеству символов в строках и их значениям.
$ for i in $(echo $str0 | grep -oP "\d+");do a=$(echo "$i" | wc -c); \
echo "$a $i"; done | sort -n | tail -1 | cut -d" " -f2
Результаты:
$ echo $str0
0000000000001a2test
$ for i in $(echo $str0 | grep -oP "\d+");do a=$(echo "$i" | wc -c); \
echo "$a $i"; done | sort -n | tail -1 | cut -d" " -f2
0000000000001
Вы можете немного сократить это, используя способность Bash определять длину переменной, используя ${#var}
.
$ for i in $(echo $str0 | grep -oP "\d+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001
Использование `grep -P
Я решил использовать grep -P ...
выше, потому что мне, будучи разработчиком Perl, нравится синтаксис класса, состоящий в том, чтобы произносить все цифры следующим образом:, \d+
вместо [[:digit:]]\+
или [0-9]\+
. Но для этой конкретной проблемы это действительно не нужно. Вы могли бы так же легко поменять местами, как grep
я использовал, вот так:
$ .... grep -o "[0-9]\+" ....
Например:
$ for i in $(echo $str0 | grep -o "[0-9]\+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001