ใช้ regex ภายในถ้าประโยคในทุบตี


10

ดูที่นี่ถ้าบล็อก:

#!/bin/bash

str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
    echo "matched"
else
    echo "not matched"
    exit 1
fi

exit 0

สิ่งนี้ควรพิมพ์ "จับคู่" แต่ไม่ควรพิมพ์ ฉันจะไปไหนผิด

คำตอบ:


21

คุณต้องลบข้อความในการแข่งขัน regex

if [[ ${str} =~ m\.m ]]; then

จากหน้าคนทุบตี:

[... ] มีตัวดำเนินการไบนารีเพิ่มเติม = ~ พร้อมใช้งานโดยมีลำดับความสำคัญเท่ากับ == และ! = เมื่อมีการใช้งานสตริงทางด้านขวาของโอเปอเรเตอร์จะถูกพิจารณาว่าเป็น expres‐sion แบบปกติที่ขยายเพิ่มและจับคู่ตามนั้น (เช่นใน regex (3)) ค่าตอบแทนคือ 0 ถ้าสตริงตรงกับรูปแบบและ 1 เป็นอย่างอื่น หากนิพจน์ทั่วไปไม่ถูกต้องทางไวยากรณ์ค่าส่งคืนของนิพจน์เงื่อนไขคือ 2 หากเปิดใช้งานอ็อพชัน nocasematch ของตัวเลือกเชลล์การจับคู่จะดำเนินการโดยไม่คำนึงถึงตัวอักษรที่เป็นตัวอักษร ส่วนใดส่วนหนึ่งของรูปแบบอาจถูกยกมาเพื่อบังคับให้มันจับคู่เป็นสตริง

ดังนั้นด้วยคำพูดคุณกำลังใช้การจับคู่สตริงที่ดี

หากคุณต้องการช่องว่างในรูปแบบเพียงแค่หลบหนี:

str="m   m"
if [[ ${str} =~ m\ +m ]]; then

แต่ไม่มีเครื่องหมายคำพูดคู่เราไม่สามารถใช้อักขระช่องว่างในรูปแบบ regex มีวิธีแก้ปัญหาสำหรับสิ่งนั้นหรือไม่?
Majid Azimi

1
ควรหนีช่องว่างเช่น\ นี้
ДМИТРИЙМАЛИКОВ

หากฉันต้องการค้นหาสตริงที่ลงท้ายด้วยตัวเลขไดนามิกควรใช้${str} =~ "needle"[0-9]{1}หรือควรใช้${str} =~ needle[0-9]{1}?
mgutt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.