Credo che si può fare questo con un solo grep
, sort
e tail
pure. Ecco alcune stringhe di esempio.
$ echo <str> | grep -oP "\d+" | sort -n | tail -1
Dov'è la <str>
nostra stringa in questione.
Esempio
$ set -o posix; set | grep "str[0-9]"
str0=212334123434test233
str1=212334123434test233abc44
str2=233test212334123434
str3=a212334123434test233abc44
str4=a91234b212334123434abc
Ora, se eseguo questi tramite il mio grep ...
comando a turno.
$ 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
Questo approccio funziona selezionando tutte le sottostringhe che sono sequenze di cifre. Ordiniamo quindi numericamente questo output sort -n
, e quindi prendiamo l'ultimo valore nell'elenco, usando tail -1
. Questa sarà la sottostringa più lunga.
Puoi vedere come funziona togliendo tail -1
e rilanciando uno degli esempi:
$ echo $str4 | grep -oP "\d+" | sort -n
91234
212334123434
Stringhe che iniziano con zeri
L'approccio di cui sopra funziona per ogni situazione che potrei concepire tranne una. @terdon ha menzionato nella chat questo scenario che ostacola l'approccio sopra.
Quindi, per far fronte a questo, dovrai cambiare leggermente le tattiche. Il kernel dell'approccio sopra può ancora essere sfruttato, tuttavia è necessario iniettare anche il numero di caratteri nei risultati. Ciò consente di ordinare i risultati in base al numero di caratteri nelle stringhe e ai loro valori.
$ 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
risultati:
$ 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
Puoi condensarlo un po 'sfruttando la capacità di Bash di determinare la lunghezza di una variabile 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
Ho optato per l'uso grep -P ...
sopra perché io, essendo uno sviluppatore Perl, mi piace la sintassi della classe di dire tutte le cifre in questo modo:, \d+
invece di [[:digit:]]\+
o [0-9]\+
. Ma per questo particolare problema non è davvero necessario. Potresti scambiare facilmente l' grep
ho usato così:
$ .... grep -o "[0-9]\+" ....
Per esempio:
$ for i in $(echo $str0 | grep -o "[0-9]\+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001