ผมเชื่อว่าคุณสามารถทำเช่นนี้มีเพียงgrep
, sort
และtail
เช่นกัน นี่คือตัวอย่างสตริง
$ echo <str> | grep -oP "\d+" | sort -n | tail -1
<str>
สตริงของเราอยู่ที่ไหนภายใต้คำถาม
ตัวอย่าง
$ set -o posix; set | grep "str[0-9]"
str0=212334123434test233
str1=212334123434test233abc44
str2=233test212334123434
str3=a212334123434test233abc44
str4=a91234b212334123434abc
ตอนนี้ถ้าฉันเรียกใช้เหล่านี้ผ่าน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
วิธีการนี้ใช้งานได้โดยเลือกสตริงย่อยทั้งหมดที่เป็นลำดับของตัวเลข จากนั้นเราจะเรียงลำดับผลลัพธ์นี้ตัวเลขแล้วคว้าค่าสุดท้ายในรายการที่ใช้sort -n
tail -1
นี่จะเป็นสตริงย่อยที่ยาวที่สุด
คุณสามารถดูวิธีการทำงานได้โดยtail -1
ถอดและทำซ้ำตัวอย่างใดตัวอย่างหนึ่ง:
$ echo $str4 | grep -oP "\d+" | sort -n
91234
212334123434
สตริงที่ขึ้นต้นด้วยศูนย์
วิธีการข้างต้นใช้ได้กับทุกสถานการณ์ที่ฉันสามารถนึกได้ยกเว้นเพียงข้อเดียว @terdon พูดถึงในการแชทสถานการณ์นี้ซึ่งเกียดแนวทางข้างต้น
ดังนั้นเพื่อรับมือกับสิ่งนี้คุณจะต้องเปลี่ยนยุทธวิธีเล็กน้อย เคอร์เนลของวิธีการข้างต้นยังคงสามารถใช้ประโยชน์ได้อย่างไรก็ตามเราจำเป็นต้องฉีดจำนวนอักขระลงในผลลัพธ์ด้วย สิ่งนี้ทำให้การเรียงลำดับความสามารถในการเรียงลำดับผลลัพธ์ตามจำนวนอักขระในสตริง & ค่าของพวกเขา
$ 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
ผล:
$ 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
${#var}
คุณสามารถย่อบิตนี้โดยการใช้ความสามารถในการทุบตีเพื่อกำหนดความยาวของตัวแปรที่ใช้
$ for i in $(echo $str0 | grep -oP "\d+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001
ใช้ `grep -P
ฉันเลือกที่จะใช้grep -P ...
ข้างต้นเพราะผมเป็นนักพัฒนา Perl เช่นไวยากรณ์ชั้นบอกว่าตัวเลขทุกคนชอบดังนั้น: \d+
แทนหรือ[[:digit:]]\+
[0-9]\+
แต่สำหรับปัญหานี้โดยเฉพาะมันไม่จำเป็นจริงๆ คุณสามารถเปลี่ยนได้อย่างง่ายดายจากที่grep
ฉันเคยใช้:
$ .... grep -o "[0-9]\+" ....
ตัวอย่างเช่น:
$ for i in $(echo $str0 | grep -o "[0-9]\+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001