Saya percaya Anda dapat melakukan ini dengan hanya grep
, sort
dan tail
juga. Berikut adalah beberapa contoh string.
$ echo <str> | grep -oP "\d+" | sort -n | tail -1
Di mana <str>
string kami sedang dipertanyakan.
Contoh
$ set -o posix; set | grep "str[0-9]"
str0=212334123434test233
str1=212334123434test233abc44
str2=233test212334123434
str3=a212334123434test233abc44
str4=a91234b212334123434abc
Sekarang jika saya menjalankan ini melalui grep ...
perintah saya pada gilirannya.
$ 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
Pendekatan ini bekerja dengan memilih semua substring yang merupakan urutan digit. Kami kemudian mengurutkan output ini secara numerik,, sort -n
dan kemudian mengambil nilai terakhir dalam daftar, menggunakan tail -1
. Ini akan menjadi substring terpanjang.
Anda dapat melihat cara kerjanya dengan tail -1
melepas dan menjalankan kembali salah satu contoh:
$ echo $str4 | grep -oP "\d+" | sort -n
91234
212334123434
String yang dimulai dengan nol
Pendekatan di atas berfungsi untuk setiap situasi yang bisa saya bayangkan kecuali satu. @terdon disebutkan dalam obrolan skenario ini yang menggagalkan pendekatan di atas.
Jadi untuk menghadapi ini, Anda perlu sedikit mengubah taktik. Kernel dari pendekatan di atas masih dapat ditingkatkan, namun kita perlu menyuntikkan jumlah karakter ke dalam hasil juga. Ini memberikan kemampuan untuk mengurutkan hasil berdasarkan jumlah karakter dalam string & nilainya.
$ 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
Hasil:
$ 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
Anda bisa menyingkat sedikit ini dengan memanfaatkan kemampuan Bash untuk menentukan panjang variabel yang digunakan ${#var}
.
$ for i in $(echo $str0 | grep -oP "\d+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001
Menggunakan `grep -P
Saya memilih untuk menggunakan di grep -P ...
atas karena saya, sebagai pengembang Perl, menyukai sintaksis kelas untuk mengatakan semua digit seperti:: \d+
, bukannya [[:digit:]]\+
atau [0-9]\+
. Tetapi untuk masalah khusus ini tidak terlalu dibutuhkan. Anda bisa dengan mudah menukar yang grep
saya gunakan seperti ini:
$ .... grep -o "[0-9]\+" ....
Sebagai contoh:
$ for i in $(echo $str0 | grep -o "[0-9]\+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001