2013-08-12 30 views
6

Giả sử tôi có một tệp abc.txt có chứa dòng ab*cd. Khi tôi grep rằng mẫu ab*cd với dấu ngoặc kép nhưng không thoát khỏi dấu nó không hoạt động:Làm thế nào để grep dấu hoa thị mà không cần thoát?

 
> grep ab*c abc.txt 
> grep "ab*c" abc.txt 
> grep 'ab*c' abc.txt 

Khi tôi sử dụng cả dấu ngoặc kép và thoát nó không việc

 
> grep "ab\*c" abc.txt 
ab*cd 
> grep 'ab\*c' abc.txt 
ab*cd 

Bây giờ tôi tự hỏi tại sao các dấu ngoặc kép không hoạt động và nếu tôi có thể sử dụng chỉ trích dẫn mà không cần thoát dấu hoa thị.

+2

Bạn cũng có thể sử dụng một lớp nhân vật để phù hợp với một dấu đen. Bởi vì dấu ngoặc vuông cũng có ý nghĩa trong trình bao, bạn vẫn cần báo giá biểu thức; 'grep 'ab [*] c' abc.txt' – tripleee

+1

Vấn đề bạn đang cố giải quyết là gì? Nếu bạn có ý định sử dụng vỏ, bạn cần phải hiểu metacharacters và trích dẫn, không tránh chúng. – tripleee

Trả lời

12

Sử dụng cờ -F để tìm kiếm chuỗi cố định - thay vì biểu thức thông thường. Từ man grep:

-F, --fixed-strings 
      Interpret PATTERN as a list of fixed strings, separated by 
      newlines, any of which is to be matched. (-F is specified by 
      POSIX.) 

Ví dụ:

$ grep -F "ab*c" <<< "ab*c" 
ab*c 
6

trước hết, bạn nên lưu ý: regex =/= glob

* có ý nghĩa đặc biệt trong regex. Bạn phải thoát khỏi nó để phù hợp với nó theo nghĩa đen. mà không cần thoát khỏi *, grep cố gắng để phù hợp với ab+(any number of b)+c

ví dụ:

abbbbbbbbbbbbc

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