2012-06-13 30 views
7

Tôi cố gắng để sử dụng một biểu thức chính quy với lệnh grep trong LinuxPhạm vi grep với biểu thức thông thường

(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$)) 

Khi tôi đang cố gắng nó ra tại https://www.regextester.com với các nội dung của một tập tin, tôi nhận được kết quả cần thiết , tức là các trường bắt buộc sẽ khớp nhau nhưng khi tôi đang cố gắng sử dụng nó như là

grep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1 

tất cả điều này mang lại cho tôi là vô giá trị!

Sự cố ở đây là gì?

Trả lời

2
pcregrep -M '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' 

đã làm các trick :)

3

Tôi không nghĩ rằng grep hiểu các lớp nhân vật như \w\s. Hãy thử sử dụng grep -E hoặc egrep. (grep -E tương đương với egrep, egrep chỉ là ngắn hơn để gõ.)

Vì vậy, lệnh của bạn sẽ là:

egrep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1 
+0

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? –

+1

@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) –

+0

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. –

0

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ử +| 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:]][[:alnum:]_] là một lựa chọn thay thế di động để \s\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\w) và sự lặp lại không tham lam (+?), như các phần mở rộng không di động.

Các vấn đề liên quan