Nó không phải là vỏ
Không có câu trả lời nào cho đến nay đã chạm vào vấn đề thực sự. Nó sẽ hữu ích để giải thích tại sao nó không hoạt động như bạn mong đợi.
grep -i "^**" test.out
Bởi vì bạn đã trích dẫn các mô hình để grep , *
được không mở rộng bằng vỏ. Nó được truyền cho grep như vốn có. Điều này được giải thích trong trang hướng dẫn [1] cho bash [2] :
Việc đóng dấu các ký tự trong dấu ngoặc kép sẽ giữ giá trị bằng chữ của tất cả các ký tự trong dấu ngoặc kép, ngoại trừ $, `, \, và, khi mở rộng lịch sử được bật,!.
Đó là biểu thức chính quy thông thường
Biểu thức chính quy là một mẫu mô tả một chuỗi các chuỗi.
*
là một trong những mẫu chính trong biểu thức chính quy. Theo mặc định, grep diễn giải nó như sau:
* The preceding item will be matched zero or more times.
Điều này có nghĩa là mô hình của bạn khi nó đứng, ^**
không có nhiều ý nghĩa. Có thể nó cố gắng khớp với đầu của dòng 0 hoặc nhiều lần , hai lần. Dù điều đó có nghĩa là gì.
Giải pháp là trích dẫn nó:
Bất kỳ ký tự meta nào có ý nghĩa đặc biệt có thể được trích dẫn bằng cách đặt trước nó bằng dấu gạch chéo ngược.
grep -i "^\*\*" test.out
[1] Tôi không khuyên bạn nên đọc nó. Vui lòng sử dụng man dash
hoặc tương tự thay thế.
[2] Không có vỏ được đưa ra, vì vậy tôi giả sử bash .
*
không cần thoát trong trường hợp cụ thể này, fwiw.