Я ищу метод для печати самого длинного числа в строке.
Например: если у меня есть строка
212334123434test233
как я могу распечатать
212334123434
?
Примечание: я ищу самую длинную непрерывную последовательность чисел, а не численно более высокое значение.
Изменить: Спасибо за ответы, все. Ответ на этот вопрос был довольно ошеломляющим. Я пометил пост @ HaukeLaging как принятый ответ, потому что он очень хорошо подходил для моего конкретного случая, но я хотел бы отметить, что все ответы одинаково действительны. Всегда здорово иметь несколько разных вариантов решения проблемы.
text-processing
sed
awk
Glutanimate
источник
источник
Ответы:
источник
Я считаю , что вы можете сделать это только с
grep
,sort
иtail
как хорошо. Вот несколько примеров строк.Где
<str>
наша строка под вопросом.пример
Теперь, если я проведу их через свою
grep ...
команду по очереди.Этот подход работает путем выбора всех подстрок, которые являются последовательностями цифр. Затем мы сортируем эти выходные данные численно,
sort -n
а затем берем последнее значение в списке, используяtail -1
. Это будет самая длинная подстрока.Вы можете увидеть, как это работает, взяв
tail -1
и повторно запустив один из примеров:Строки, начинающиеся с нулей
Вышеупомянутый подход работает для любой ситуации, которую я мог себе представить, кроме одной. @terdon упомянул в чате этот сценарий, который мешает вышеуказанному подходу.
Таким образом, чтобы справиться с этим, вам нужно немного изменить тактику. Ядро вышеупомянутого подхода все еще можно использовать, однако нам нужно также ввести количество символов в результаты. Это дает возможность сортировки результатов по количеству символов в строках и их значениям.
Результаты:
Вы можете немного сократить это, используя способность Bash определять длину переменной, используя
${#var}
.Использование `grep -P
Я решил использовать
grep -P ...
выше, потому что мне, будучи разработчиком Perl, нравится синтаксис класса, состоящий в том, чтобы произносить все цифры следующим образом:,\d+
вместо[[:digit:]]\+
или[0-9]\+
. Но для этой конкретной проблемы это действительно не нужно. Вы могли бы так же легко поменять местами, какgrep
я использовал, вот так:Например:
источник
${#i}
чтобы получить длину строки, может спасти ваши звонкиwc
, если вы хотите использовать bashgrep -o "[0-9]\+"
вместоgrep -oP "\d+"
Решение в
perl
:Ссылки
источник
Используя python со строкой, переданной в командной строке, и предположим, что вы хотите первую последовательность максимальной длины:
источник
python -c "import re,sys; print max(re.split(r'\D+', sys.argv[1]), key=len)"
Вот еще один подход Perl, который может работать как с десятичными числами, так и с целыми числами:
Обратите внимание, что ни один из опубликованных ответов не будет иметь дело с десятичными знаками, и, поскольку вы указываете, что хотите получить самое длинное, а не числовое наибольшее число, я предполагаю, что вам действительно нужны десятичные дроби.
объяснение
perl -lne
:-n
Означает «читать входные данные построчно и запускать сценарий, заданный для-e
него».-l
Добавляет новую строку каждогоprint
вызова (и другие вещи , не имеющие отношения здесь).while(/([\d.]+)/g)
: выполнить итерацию по всем числам (\d
значит[0-9]
, так[\d.]
будут совпадать цифры и.
. Если вы также хотите найти отрицательные числа, добавьте-
. В скобках указана совпадающая строка,$1
которая используется на следующем шаге.$max=$1 if length($1) > length($max)
: Если длина текущего совпадения больше, чем самая длинная ($max
), сохраните совпадение как$max
.print $max
: вывести самую длинную найденную строку чисел. Это будет выполнено после завершения цикла while, то есть после того, как все числа будут найдены.источник
\D(\d+(?:\.\d+)?)\D
этого.\D
якорей ....
как в IP-адресах.Данный
тогда в баш
Возможно, более чистое решение bash с использованием массива, созданного путем замены нецифровых символов в строке пробелом вместо grep
источник
Основываясь на ответе @mikeserv, вот еще одна альтернатива. Он извлекает числа (по методу mikeserv), затем сортирует их по порядку номеров и берет последнее. Если исключить начальные нули, это даст вам наибольшее число (без учета знака):
источник
set -- $(echo $str | tr ... ) ; b=${#1} ; for d ; do [ ${#d} -gt $b ] && b=${#d} n=$d ; done ; echo $n
tr
любом случае, я не буду обижаться, если вы включите выше. Возможно,sort
это быстрее, но опять же, он ожидает окончания потока так же, как и$(subshell)
. Я не знаю. В любом случае, ваш ответ уже отличный, но если вы хотите добавить в вышеупомянутый цикл оболочки, не стесняйтесь, это все, что я говорю. И, между прочим - возможно, что вы могли бы обойтисьsort
вообще без небольшой творческой обработкиwc -L
иtee
в потоке ... Я закончил с этим вопросом, хотя - я смущен.tr
из подоболочки и избавиться от нееprintf
. Просто делай'0-9' '\n'
.Bash и GNU сортировать
источник
Используйте нечисловые символы для разделения строки и найдите самую длинную последовательность или наибольшее числовое значение (для чисел одинаковой длины) с помощью троичного оператора.
Вы также можете установить разделитель записей awk (
RS
) как любую нечисловую строку символов:источник
RS = '[^0-9]+'
и использовать собственный цикл Awk?echo "212334123434test233" | awk -v RS='[^0-9]+' 'length(longest) < length($0) {longest = $0};END{print longest}' 212334123434
RS
переменной, я должен признать, что это первый раз, когда я вижу это. У вас есть больше советов,awk
чем я, хахаха!