Я вважаю , що ви можете зробити це тільки з 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