Nhìn vào cái này nếu khối:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
Điều này sẽ in "khớp", nhưng nó không. Tôi làm sai ở đâu?
Nhìn vào cái này nếu khối:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
Điều này sẽ in "khớp", nhưng nó không. Tôi làm sai ở đâu?
Câu trả lời:
Bạn cần loại bỏ trích dẫn trong trận đấu regex.
if [[ ${str} =~ m\.m ]]; then
Từ trang bash man:
[...] Một toán tử nhị phân bổ sung, = ~, có sẵn, với cùng mức ưu tiên là == và! =. Khi nó được sử dụng, chuỗi bên phải của toán tử được coi là một biểu hiện thường xuyên mở rộng và được khớp với nhau (như trong regex (3)). Giá trị trả về là 0 nếu chuỗi khớp với mẫu và 1 nếu không. Nếu biểu thức chính quy về mặt cú pháp không chính xác, giá trị trả về của biểu thức điều kiện là 2. Nếu tùy chọn shell nocasematch được bật, kết quả khớp được thực hiện mà không liên quan đến trường hợp các ký tự chữ cái. Bất kỳ phần nào của mẫu có thể được trích dẫn để buộc nó phải khớp với dạng chuỗi.
Vì vậy, với dấu ngoặc kép, bạn đang sử dụng kết hợp chuỗi cũ.
Nếu bạn cần khoảng trắng trong mẫu, chỉ cần thoát chúng:
str="m m"
if [[ ${str} =~ m\ +m ]]; then
\
.
${str} =~ "needle"[0-9]{1}
hay tôi nên sử dụng ${str} =~ needle[0-9]{1}
?