grep(1)
sử dụng POSIX Basic Regular Expressions theo mặc định, và POSIX Extended Regular Expressions khi được sử dụng với tùy chọn -E
.
Trong POSIX Regular Expressions các ký tự không đặc biệt có hành vi không xác định khi thoát, ví dụ: \s
và không có cú pháp cho đối sánh không tham lam, ví dụ: +?
. Hơn nữa, trong BRE, các toán tử +
và |
không khả dụng và phải được thoát dấu ngoặc đơn để thực hiện nhóm.
Các POSIX character classes[[:space:]]
và [[:alnum:]_]
là một lựa chọn thay thế di động để \s
và \w
tương ứng.
Việc loại trừ ký tự trùng khớp tiếp theo khỏi sự lặp lại có thể được sử dụng để mô phỏng đối sánh không tham lam, ví dụ: [^*]+?\w*:
tương đương đến [^*[:alnum:]_:]+[[:alnum:]_]*:
.
Các biểu hiện thường xuyên nhất định có thể được biểu diễn như nhiều BREs:
grep -e '^[[:space:]]*\*[[:space:]]\{1,\}\[ \][^*[:alnum:]_+]\{1,\}[[:alnum:]_]*:[^*]\{1,\}[[:digit:]]$' \
-e '[^*]\{1,\}\.com\.au$' file1
hoặc một ERE:
grep -E '^[[:space:]]*\*[[:space:]]*\[ \][^*[:alnum:]_:]+[[:alnum:]_]*:[^*]+[[:digit:]]$|[^*]+\.com\.au$' \
file1
Lưu ý rằng việc thực hiện GNU của grep(1)
cho phép cả hai lớp nhân vật ngắn (\s
và \w
) và sự lặp lại không tham lam (+?
), như các phần mở rộng không di động.
thats cool nhưng làm cách nào để tôi thực hiện tìm kiếm nhiều dòng? giả định grep hoạt động theo từng dòng .. tôi muốn tìm kiếm nhiều dòng .. vì vậy có giải pháp nào không? –
@KiranVemuri Đó là một câu hỏi khác mà bạn đặt ra ở đây. Chủ đề đó được đề cập bởi [câu hỏi SO này] (http: // stackoverflow.com/questions/152708/how-can-i-search-cho-a-multiline-pattern-in-a-file-use-pcregrep) –
Theo mặc định, egrep không hiểu \ s hoặc \ w. Tuy nhiên, bạn có thể sử dụng cờ --perl-regexp nếu PCRE được biên dịch. –