Tôi tin rằng bạn có thể làm điều này với chỉ grep
, sort
và tail
là tốt. Dưới đây là một số chuỗi ví dụ.
$ echo <str> | grep -oP "\d+" | sort -n | tail -1
<str>
Chuỗi của chúng tôi ở đâu trong câu hỏi.
Thí dụ
$ set -o posix; set | grep "str[0-9]"
str0=212334123434test233
str1=212334123434test233abc44
str2=233test212334123434
str3=a212334123434test233abc44
str4=a91234b212334123434abc
Bây giờ nếu tôi chạy chúng thông qua grep ...
lệnh của tôi lần lượt.
$ 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
Cách tiếp cận này hoạt động bằng cách chọn tất cả các chuỗi con là chuỗi các chữ số. Sau đó, chúng tôi sắp xếp đầu ra này bằng số, sort -n
và sau đó lấy giá trị cuối cùng trong danh sách, sử dụng tail -1
. Đây sẽ là chuỗi con dài nhất.
Bạn có thể thấy nó hoạt động như thế nào bằng cách tail -1
tắt và chạy lại một trong các ví dụ:
$ echo $str4 | grep -oP "\d+" | sort -n
91234
212334123434
Chuỗi bắt đầu bằng số không
Cách tiếp cận trên hoạt động cho mọi tình huống tôi có thể nghĩ ra ngoại trừ một tình huống. @terdon đã đề cập trong trò chuyện kịch bản này cho phép tiếp cận ở trên.
Vì vậy, để đối phó với điều này, bạn sẽ cần thay đổi chiến thuật một chút. Hạt nhân của cách tiếp cận trên vẫn có thể được sử dụng, tuy nhiên chúng ta cũng cần đưa số lượng ký tự vào kết quả. Điều này cho phép sắp xếp khả năng sắp xếp kết quả theo số lượng ký tự trong chuỗi & giá trị của chúng.
$ 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
Các kết quả:
$ 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
Bạn có thể ngưng tụ điều này một chút bằng cách sử dụng khả năng của Bash để xác định độ dài của biến bằng cách sử dụng ${#var}
.
$ for i in $(echo $str0 | grep -oP "\d+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001
Sử dụng `grep -P
Tôi đã chọn sử dụng grep -P ...
ở trên vì tôi, là nhà phát triển Perl, thích cú pháp lớp nói tất cả các chữ số như vậy : \d+
, thay vì [[:digit:]]\+
hoặc [0-9]\+
. Nhưng đối với vấn đề đặc biệt này thì nó không thực sự cần thiết. Bạn có thể dễ dàng trao đổi như grep
tôi đã sử dụng như vậy:
$ .... grep -o "[0-9]\+" ....
Ví dụ:
$ for i in $(echo $str0 | grep -o "[0-9]\+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001