2010-06-09 23 views
16

Hành vi của Grep khác nhau tùy thuộc vào loại dấu ngoặc kép tôi bao quanh regex. Tôi dường như không hiểu rõ tại sao lại như vậy. Dưới đây là ví dụ về sự cố:Báo giá khi sử dụng grep?

hamiltont$ grep -e show\( test.txt 
    variable.show(); 
    variable.show(a); 
    variable.show(abc, 132); 
    variableshow(); 
hamiltont$ grep -e "show\(" test.txt 
grep: Unmatched (or \(
hamiltont$ grep -e 'show\(' test.txt 
grep: Unmatched (or \(

Tôi chỉ giả định có một cách thích hợp để bao gồm regex với dấu nháy đơn/kép. Bất kỳ giúp đỡ?

FWIW, grep --version lợi nhuận grep (GNU grep) 2.5.1

Trả lời

23

Dòng lệnh bao gồm các đối số được xử lý bởi trình bao trước khi nó được thực thi. để xem những gì vỏ làm:

$ echo grep -e show\( test.txt 
grep -e show(test.txt 

$ echo grep -e "show\(" test.txt 
grep -e show\(test.txt 

$ echo grep -e 'show\(' test.txt 
grep -e show\(test.txt 

vì vậy mà không có dấu ngoặc kép dấu chéo ngược được lấy ra làm "(" một nhân vật bình thường đối với grep (grep sử dụng cơ bản regex theo mặc định, sử dụng -E để làm grep sử dụng mở rộng regex).

+0

OK, cảm ơn! – Hamy

+0

Tôi vẫn không nhận được sự khác biệt giữa dấu nháy đơn và dấu ngoặc kép. Trong ví dụ bạn đăng, họ dường như cũng làm điều tương tự. –

+0

Điều gì sẽ xảy ra nếu tôi có một regex grep phải khớp với một trích dẫn đơn hoặc một câu trích dẫn kép, làm thế nào tôi có thể viết nó bằng grep? 'grep '["] \' "' có vẻ không hoạt động ... – tonix

0

Tôi không tin điều đó là grep mà là hành xử khác nhau, đó là vỏ. Tôi giả sử bạn đang sử dụng bash

http://www.faqs.org/docs/bashman/bashref_8.html

Về cơ bản các phiên bản được trích dẫn được hành xử khác nhau trên các dấu gạch chéo, tùy thuộc vào cơ chế trích dẫn.

Cả hai ví dụ được trích dẫn sẽ hoạt động mà không có dấu gạch chéo. Đối với cái đầu tiên, vỏ sẽ thoát khỏi (và vượt qua chỉ hiển thị (cho grep cho mẫu)

2

Các trích dẫn thay đổi những gì grep thấy. Dấu gạch chéo ngược (\) trong biểu mẫu không được trích dẫn được xử lý bởi trình bao, xử lý các ký tự sau dấu gạch chéo ngược là đặc biệt. Điều này xảy ra trước khi grep nhận được tham số. Khi dấu ngoặc kép (đơn hoặc đôi) được sử dụng, vỏ diễn giải chúng là "để nguyên nội dung", do đó grep thấy hiển thị \ (\ ( ký tự có ý nghĩa trong grep và nó là tìm kiếm những đóng ngoặc - \)

BTW:. Độc thân và xử lý báo giá gấp đôi là khác nhau trong cách vỏ xử lý các biến shell, nhưng không có các biến shell trong ví dụ của bạn

+0

OK, cảm ơn! – Hamy

3

thứ tự:

.
grep -e show(test.txt 

không hoạt động, vì shell diễn giải ( là đặc biệt, dấu ngoặc đơn, không chỉ là ký tự và không thể tìm thấy số ) đóng.

Những cả công việc:

grep -e 'show(' test.txt 
grep -e "show(" test.txt 

vì vỏ xử lý các văn bản trích dẫn khi chỉ văn bản, và vượt qua nó để grep.

Những điều này không làm việc:

grep -e 'show\(' test.txt 
grep -e "show\(" test.txt 

vì vỏ đi show\( để grep, grep thấy \( như đặc biệt, một ngoặc đơn, không chỉ là một nhân vật, và không thể tìm thấy bế mạc \).

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