Ben sadece ile yapabilirsiniz inanıyoruz grep
, sort
ve tail
de. İşte bazı örnek dizeler.
$ echo <str> | grep -oP "\d+" | sort -n | tail -1
<str>
Soru dizimiz nerede .
Misal
$ set -o posix; set | grep "str[0-9]"
str0=212334123434test233
str1=212334123434test233abc44
str2=233test212334123434
str3=a212334123434test233abc44
str4=a91234b212334123434abc
Şimdi bunları komutum aracılığıyla çalıştırırsam 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
Bu yaklaşım, basamak dizisi olan tüm alt dizeleri seçerek çalışır. Daha sonra bu çıktıyı sayısal olarak sıralarız sort -n
ve ardından kullanarak listedeki son değeri alırız tail -1
. Bu en uzun alt dize olacaktır.
tail -1
Örneklerden birini alıp yeniden çalıştırarak nasıl çalıştığını görebilirsiniz :
$ echo $str4 | grep -oP "\d+" | sort -n
91234
212334123434
Sıfırlarla başlayan dizeler
Yukarıdaki yaklaşım, biri dışında kavrayabildiğim her durum için işe yarar. @terdon , yukarıdaki yaklaşımı engelleyen bu senaryoyu sohbette belirtti .
Bu yüzden bununla başa çıkmak için taktikleri biraz değiştirmeniz gerekir. Yukarıdaki yaklaşımın çekirdeği hala kullanılabilir, ancak sonuçlara karakter sayısını da eklememiz gerekir. Bu sıralama sonuçlarını dizelerdeki karakterlerin sayısına ve değerlerine göre sıralama yeteneğini verir.
$ 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
Sonuçlar:
$ 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'in bir değişkenin uzunluğunu belirleme yeteneğini kullanarak bunu biraz yoğunlaştırabilirsiniz ${#var}
.
$ for i in $(echo $str0 | grep -oP "\d+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001
`Grep -P'yi kullanma
grep -P ...
Yukarıda kullanmayı tercih ettim çünkü Perl geliştiricisi olarak sınıfın sözdizimi gibi tüm basamakları söyleme gibi: veya \d+
yerine . Ancak bu özel sorun için gerçekten gerekli değildir. Bu şekilde kullandığım gibi kolayca değiştirebilirsiniz :[[:digit:]]\+
[0-9]\+
grep
$ .... grep -o "[0-9]\+" ....
Örneğin:
$ for i in $(echo $str0 | grep -o "[0-9]\+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001