2013-06-10 9 views
22

Xin chào cộng đồng tuyệt vời,Cụm từ thông dụng trong Bash Script

Tôi hoàn toàn chán nản khi nói đến regex. Tôi đã ngừng học nó .. và bây giờ sự lười biếng của tôi đã bắt kịp tôi.

Những gì tôi đang cố gắng để làm:
Kiểm tra xem một chuỗi phù hợp với định dạng này:

10_06_13 

tức. Todays ngày, hoặc một ngày tương tự với "2digits_2digits_2digits"

Những gì tôi đã làm:

regex='([0-9][0-9][_][0-9][0-9][_][0-9][0-9])' 
if [[ "$incoming_string" =~ $regex ]] 
then 
    # Do awesome stuff here 
fi 

này hoạt động đến một mức độ nhất định. Nhưng khi chuỗi đến bằng 011_100_131 ... nó vẫn vượt qua kiểm tra regex.

Tôi rất biết ơn nếu có ai có thể giúp chỉ cho tôi đúng hướng.
Cheers

+1

Lưu ý rằng dấu gạch dưới không cần phải nằm trong dấu ngoặc vuông. '_' trùng khớp với' [_] '. – chepner

+2

011_100_131 sẽ không khớp với regex của bạn. 011_10_131. – hop

Trả lời

35

=~ thành công nếu các chuỗi trên trái chứa một trận đấu cho các regex ở bên phải. Nếu bạn muốn biết nếu chuỗi phù hợp regex, bạn cần phải "neo" regex trên cả hai mặt, như thế này:

regex='^[0-9][0-9][_][0-9][0-9][_][0-9][0-9]$' 
if [[ $incoming_string =~ $regex ]] 
then 
    # Do awesome stuff here 
fi 

Các ^ chỉ thành công ở phần đầu của chuỗi, và $ chỉ thành công ở cuối.

Ghi chú:

  1. tôi loại bỏ các không cần thiết () từ regex và "" từ [[ ... ]].
  2. Hướng dẫn bash không rõ ràng, vì nó nói rằng =~ thành công nếu chuỗi khớp.
+0

Chết tiệt, tôi đã rất thân thiết! Tôi cho rằng '^' là loại trừ các ký tự. Cảm ơn nhiều! :) – Robbie

+7

@Robbie: '^' có nghĩa là "không bao gồm" khi nó là điều đầu tiên trong một bộ ký tự ('[...]'), và nó có nghĩa là "neo" khi nó là điều đầu tiên trong một mẫu. Nếu không, nó chỉ khớp với '^' (nhưng điều đó không đúng trong tất cả các triển khai regex; đôi khi nó có nghĩa là "khớp với đầu của một dòng"). Tôi đồng ý rằng nó gây nhầm lẫn cho đến khi bạn quen với nó. – rici

+0

Tuyệt vời! Rất hữu ích, cảm ơn một lần nữa. Rất xứng đáng được bình chọn! – Robbie