จะบอกได้อย่างไรว่า Bash String มี Substring บน Linux
เผยแพร่แล้ว: 2022-09-21บางครั้งในสคริปต์ Linux คุณต้องการทราบว่าสตริงข้อความมีสตริงที่เล็กกว่าและเจาะจงหรือไม่ มีหลายวิธีในการทำเช่นนี้ เราแสดงเทคนิคง่ายๆ ที่เชื่อถือได้ให้คุณดู
ทำไมสิ่งนี้จึงมีประโยชน์?
การค้นหาสตริงสำหรับสตริงย่อยที่มีขนาดเล็กกว่านั้นเป็นข้อกำหนดทั่วไป ตัวอย่างหนึ่งคือการอ่านข้อความจากไฟล์หรือจากการป้อนข้อมูลของมนุษย์ และค้นหาสตริงสำหรับสตริงย่อยเฉพาะ เพื่อให้สคริปต์ของคุณสามารถตัดสินใจว่าจะทำอย่างไรต่อไป อาจกำลังค้นหาป้ายกำกับหรือชื่ออุปกรณ์ในไฟล์การกำหนดค่าหรือสตริงคำสั่งในบรรทัดอินพุตจากผู้ใช้
ผู้ใช้ลีนุกซ์ได้รับพรด้วยยูทิลิตี้มากมายสำหรับจัดการข้อความ บางตัวสร้างไว้ใน Bash shell ส่วนบางตัวมีให้เป็นยูทิลิตี้หรือแอพพลิเคชั่นแบบสแตนด์อโลน มีเหตุผลที่ระบบปฏิบัติการที่ได้รับมาจาก Unix ได้รับการบริการอย่างครบครันพร้อมความสามารถในการจัดการสตริง
บางสิ่งที่ดูเหมือนไฟล์ไม่ใช่ไฟล์ธรรมดา เป็นไฟล์พิเศษที่ แสดงถึงสิ่งต่างๆ เช่น อุปกรณ์ฮาร์ดแวร์และแหล่งข้อมูลระบบ สิ่งที่เป็นนามธรรมที่ดำเนินการโดยระบบปฏิบัติการทำให้พวกเขามีลักษณะและลักษณะของไฟล์ คุณสามารถอ่านข้อมูลจากพวกเขา—เป็นข้อความ, เป็นธรรมชาติ— และในบางกรณีเขียนถึงพวกเขา แต่ไม่ใช่ไฟล์ธรรมดา
ข้อความยังใช้เป็นอินพุตและเอาต์พุตสำหรับคำสั่งในหน้าต่างเทอร์มินัล ซึ่งช่วยให้สามารถเปลี่ยนเส้นทางและไพพ์ของอินพุตและเอาต์พุตได้ ฟังก์ชันดังกล่าวสนับสนุนความสามารถในการเชื่อมโยงลำดับของคำสั่ง Linux เข้าด้วยกัน โดยส่งผ่านเอาต์พุตจากคำสั่งหนึ่งเป็นอินพุตไปยังคำสั่งถัดไป
การค้นหาข้อความที่เราได้รับสำหรับคำสำคัญ คำสั่ง ป้ายกำกับ หรือตัวบ่งชี้อื่นๆ โดยไม่คำนึงถึงต้นกำเนิดคือส่วนมาตรฐานในการจัดการกับข้อมูลแบบข้อความ นี่คือชุดเทคนิคง่ายๆ ที่คุณสามารถรวมไว้ในสคริปต์ของคุณเองได้
การค้นหาสตริงย่อยด้วย Bash Builtins
การทดสอบการเปรียบเทียบสตริงเครื่องหมายวงเล็บคู่ “ [[...]]
” สามารถใช้ในคำสั่ง if
เพื่อตรวจสอบว่าสตริงหนึ่งมีสตริงอื่นหรือไม่
คัดลอกสคริปต์นี้ไปยังโปรแกรมแก้ไข และบันทึกลงในไฟล์ชื่อ “double.sh”
#!/bin/bash ถ้า [[ "monkey" = *"key"* ]]; แล้ว echo "กุญแจอยู่ในลิง" อื่น echo "กุญแจไม่อยู่ในลิง" fi
คุณจะต้องทำให้สคริปต์ทำงานได้ด้วยคำสั่ง chmod
นี่เป็นขั้นตอนที่จำเป็นเสมอเพื่อให้สคริปต์ปฏิบัติการได้ คุณจะต้องทำเช่นนี้ทุกครั้งที่สร้างไฟล์สคริปต์ แทนที่ชื่อของสคริปต์ที่เหมาะสมในแต่ละกรณี
chmod +x double.sh
มาเรียกใช้สคริปต์กันเถอะ
./double.sh
วิธีนี้ใช้ได้เพราะเครื่องหมายดอกจัน ” *
” หมายถึงลำดับของอักขระใดๆ รวมถึงไม่มีอักขระ หากสตริงย่อย "คีย์" อยู่ภายในสตริงเป้าหมาย โดยมีหรือไม่มีอักขระอยู่ข้างหน้าหรือข้างหลัง การทดสอบจะคืนค่าเป็น "จริง"
ในตัวอย่างของเรา มีอักขระอยู่ด้านหน้าสตริงย่อย เหล่านี้ตรงกับเครื่องหมายดอกจันแรก ไม่มีตัวอักษรอยู่ด้านหลังสตริงย่อย แต่เนื่องจากเครื่องหมายดอกจันไม่ตรงกับอักขระใดๆ การทดสอบจึงยังคงผ่าน
เพื่อความยืดหยุ่น เราสามารถแก้ไขสคริปต์ของเราเพื่อจัดการกับตัวแปรแทนสตริงตามตัวอักษร นี่คือสคริปต์ “double2.sh”
#!/bin/bash string="ลิง" สตริงย่อย="คีย์" ถ้า [[ $string = *$substring* ]]; แล้ว echo "พบ $substring ใน $string" อื่น echo "ไม่พบ $substring ใน $string" fi
เรามาดูกันว่ามันทำงานอย่างไร
./double2.sh
วิธีนี้ใช้ได้ผลเช่นเดียวกัน โดยเราสามารถใช้ชื่อตัวแปรแทนสตริงตามตัวอักษรได้ การเปลี่ยนโซลูชันเล็กๆ ของเราให้เป็นฟังก์ชันจะให้ความยืดหยุ่นสูงสุด
นี่คือสคริปต์ “double3.sh”
#!/bin/bash shopt -s nocasematch string="ลิง" สตริงย่อย="คีย์" ทุน="ลอนดอน" check_substring () { ถ้า [[ $1 = *$2* ]]; แล้ว echo "พบ $2 ใน $1" อื่น echo "ไม่พบ $2 ใน $1" fi } check_substring "ลิง" "คีย์" check_substring $string $substring check_substring $string "กล้วย" check_substring "เวลส์" $capital
เราเรียกฟังก์ชัน check_substring
โดยใช้ตัวแปรและสตริงที่เป็นตัวอักษรผสมกัน เราใช้ shopt
กับตัวเลือก -s
(set) เพื่อตั้งค่า nocasematch
เพื่อให้การจับคู่ไม่คำนึงถึงขนาดตัวพิมพ์
นี่คือวิธีการทำงาน
./double3.sh
เราสามารถใช้เคล็ดลับในการห่อสตริงย่อยด้วยเครื่องหมายดอกจันใน case
คำสั่งได้เช่นกัน นี่คือ "case.sh"
#!/bin/bash shopt -s nocasematch string="วัลลาบี" สตริงย่อย="กำแพง" กรณี $string ใน *$สตริงย่อย*) echo "พบ $substring ใน $string" ;; *) echo "ไม่มีข้อมูลที่ตรงกัน: $string" ;; esac
การใช้คำสั่ง case
แทนการยาวมาก if
คำสั่งสามารถทำให้สคริปต์อ่านและแก้จุดบกพร่องได้ง่ายขึ้น หากคุณต้องการตรวจสอบว่าสตริงมีหนึ่งในสตริงย่อยที่เป็นไปได้หรือไม่ คำชี้แจง case
จะเป็นตัวเลือกที่ดีที่สุด
./case.sh
พบสตริงย่อย
การค้นหาสตริงย่อยด้วย grep
นอกเหนือจาก Bash builtins เครื่องมือค้นหาข้อความแรกที่คุณอาจเข้าถึงคือ grep
เราสามารถใช้ความสามารถโดยธรรมชาติของ grep
เพื่อค้นหาสตริงภายในสตริงเพื่อค้นหาสตริงย่อยของเรา
สคริปต์นี้เรียกว่า “subgrep.sh”
#!/bin/bash string="หม้อโจ๊ก" สตริงย่อย="สันเขา" ถ้า $(echo $string | grep -q $substring); แล้ว echo "พบ $substring ใน $string" อื่น echo "ไม่พบ $substring ใน $string" fi
สคริปต์ใช้ echo
เพื่อส่งสตริงไปยัง grep
ซึ่งค้นหาสตริงย่อย เรากำลังใช้ตัวเลือก -q
(เงียบ) เพื่อหยุด grep
เขียนอะไรก็ได้ไปยังเอาต์พุตมาตรฐาน
หากผลลัพธ์ของคำสั่งในวงเล็บ “ (...)
” เท่ากับศูนย์ แสดงว่าพบรายการที่ตรงกัน เนื่องจากค่า 0 เท่ากับค่า true
ใน Bash คำสั่ง if
จะถูกดำเนินการและคำสั่ง then
จะถูกดำเนินการ
เรามาดูกันว่าผลลัพธ์ของมันคืออะไร
./subgrep.sh
การค้นหาสตริงย่อยด้วย sed
เราสามารถใช้ sed
เพื่อค้นหาสตริงย่อยได้เช่นกัน
ตามค่าเริ่มต้น sed
จะพิมพ์ข้อความทั้งหมดที่ป้อนเข้าไป การใช้ sed -n
ป้องกันสิ่งนี้ บรรทัดเดียวที่พิมพ์คือบรรทัดที่ตรงกัน นิพจน์นี้จะพิมพ์บรรทัดใดๆ ที่ตรงกันหรือมีค่าของ $substring
"/$สตริงย่อย/p"
เราป้อนค่าของ $string
ลงใน sed
โดยใช้การเปลี่ยนเส้นทางที่นี่ <<<
ใช้เพื่อเปลี่ยนเส้นทางค่าไปยังคำสั่งในเชลล์ปัจจุบัน มันไม่เรียกใช้ subshell ในแบบที่ไพพ์เรียก
ตัวแรก -n
คือการทดสอบ มันจะคืนค่า true
หากผลลัพธ์จากคำสั่ง sed
ไม่ใช่ศูนย์ วิธีเดียวที่เอาต์พุตจาก sed
จะต้องไม่เป็นศูนย์คือหากพบบรรทัดที่ตรงกัน หากเป็นกรณีนี้ จะต้องพบ $substring
ใน $string
นี่คือ "subs.sh"
#!/bin/bash string="สวีเดน" สตริงย่อย = "เอเดน" ถ้า [ -n "$(sed -n "/$substring/p" <<< $string)" ]; แล้ว echo "พบ $substring ใน $string" อื่น echo "ไม่พบ $substring ใน $string" fi
เราได้รับการตอบสนองที่คาดหวังเมื่อเราเรียกใช้สคริปต์
./subsed.sh
เราสามารถทดสอบตรรกะของสคริปต์โดยแก้ไขค่าของ $substring
เพื่อให้การเปรียบเทียบล้มเหลว
./subsed.sh
หยุดค้นหา พบมัน
เครื่องมืออื่นๆ สามารถค้นหาสตริงย่อย เช่น awk
และ Perl
ได้ แต่กรณีการใช้งานง่ายๆ เช่น การค้นหาสตริงย่อยไม่รับประกันการทำงานพิเศษหรือความซับซ้อนที่เพิ่มขึ้น โดยเฉพาะอย่างยิ่ง การใช้ Bash ในตัวเพื่อค้นหาสตริงย่อยนั้นรวดเร็ว ง่ายดาย และไม่ต้องใช้เครื่องมือภายนอก
ที่เกี่ยวข้อง: วิธีการใช้คำสั่งกรณีในสคริปต์ทุบตี