Sử dụng regex bên trong mệnh đề if trong bash


10

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:


21

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

nhưng không có trích dẫn kép, chúng ta không thể sử dụng ký tự khoảng trắng trong mẫu biểu thức chính quy. Có giải pháp nào cho việc đó không?
Majid Azimi

1
Không gian nên thoát ra như thế nào \ .
ДМИТРИЙ МАЛИКОВ

Nếu tôi muốn tìm một chuỗi kết thúc bằng số động thì nên sử dụng ${str} =~ "needle"[0-9]{1}hay tôi nên sử dụng ${str} =~ needle[0-9]{1}?
mgutt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.