Eu acredito que você pode fazer isso com apenas grep
, sort
e tail
tão bem. Aqui estão alguns exemplos de strings.
$ echo <str> | grep -oP "\d+" | sort -n | tail -1
Onde <str>
está a nossa string em questão.
Exemplo
$ set -o posix; set | grep "str[0-9]"
str0=212334123434test233
str1=212334123434test233abc44
str2=233test212334123434
str3=a212334123434test233abc44
str4=a91234b212334123434abc
Agora, se eu executar estes através do meu grep ...
comando, por sua vez.
$ 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
Essa abordagem funciona selecionando todas as substrings que são sequências de dígitos. Em seguida, classificamos essa saída numericamente, sort -n
e, em seguida, obtemos o último valor da lista, usando tail -1
. Essa será a substring mais longa.
Você pode ver como ele funciona tail -1
desativando e executando novamente um dos exemplos:
$ echo $str4 | grep -oP "\d+" | sort -n
91234
212334123434
Sequências que começam com zeros
A abordagem acima funciona para todas as situações que pude conceber, exceto uma. O @terdon mencionou no chat esse cenário que frustra a abordagem acima.
Então, para lidar com isso, você precisará mudar um pouco as táticas. O núcleo da abordagem acima ainda pode ser alavancado, no entanto, precisamos injetar o número de caracteres nos resultados também. Isso permite classificar os resultados por número de caracteres nas strings e seus valores.
$ 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
Resultados:
$ 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
Você pode condensar um pouco isso usando a capacidade do Bash para determinar o comprimento de uma variável usando ${#var}
.
$ for i in $(echo $str0 | grep -oP "\d+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001
Usando `grep -P
Eu optei por usar grep -P ...
acima porque eu, como desenvolvedor Perl, gosto da sintaxe da classe de dizer todos os dígitos assim: em \d+
vez de [[:digit:]]\+
ou [0-9]\+
. Mas, para esse problema em particular, não é realmente necessário. Você poderia facilmente trocar o grep
que eu usei assim:
$ .... grep -o "[0-9]\+" ....
Por exemplo:
$ for i in $(echo $str0 | grep -o "[0-9]\+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001