Làm thế nào là \ $ ​​được giải thích bởi grep?


12

Khi tôi viết

$ grep \$  

sau đó bất cứ điều gì tôi gõ trên thiết bị đầu cuối, được khớp và in trên thiết bị đầu cuối. Làm thế nào đang \$được giải thích?

Câu trả lời:


18

Các vỏ được giải thích \$và đi qua nó thông qua để grep như $, kết thúc của nhân vật dòng. Vì vậy, giả sử dòng của bạn kết thúc, nó sẽ khớp :-)

Nếu bạn muốn khớp với một thực tế $trong grep, hãy sử dụng một trong:

grep \\\$
grep '\$'

Trước đây, shell diễn giải \\như \\$như $, cho \$. Sau này, nó không giải thích gì cả.


Đối với câu hỏi của bạn là tại sao \$khớp với ký hiệu đô la thay vì chuỗi hai ký tự, các biểu thức chính quy giống như các biểu thức được sử dụng trong grepcác ký tự đặc biệt cho một số mục đích. Một số trong số đó là:

$       end of line
^       start of line
.       any character
+       1 or more of the preceeding pattern
*       0 or more of the preceeding pattern
{n,m}   between n and m of the preceeding pattern
[x-y]   any character between x and y (such as [0-9] for a digit).

cùng với nhiều người khác.

Khi bạn muốn khớp với một nhân vật văn học thường được coi là một nhân vật đặc biệt, bạn cần phải thoát khỏi nó để grepsẽ coi đó là nhân vật bình thường.


1
để kiểm tra những gì grep thấy, hãy thử echo \$và sau đóecho \\$

Trong grep \\\ $, như bạn đã nói, \ $ được truyền cho grep để nó khớp với các chuỗi có chứa \ $, nhưng tại sao nó lại khớp với các chuỗi chỉ chứa $?

Bởi vì $ trong grep có nghĩa là kết thúc dòng. Để khớp với ký tự $, bạn cần thoát nó để grep không đối xử đặc biệt với nó. Xem cập nhật của tôi.

@Pasi: echo không tự thoát riêng của mình, tùy thuộc vào việc nó là một BUILTIN vỏ hay không, POSIX compliant hay không vv Thà (IMHO) để sử dụng ls \$và thấy rằng chúng tôi có được "ls: $: Không có tập tin hoặc thư mục", để thấy rằng \ $ không bị hủy bỏ thành $ nhưng \\ $ không được giải quyết thành \ $, v.v.
Henno

5

Shell trước tiên mở rộng bất kỳ chuỗi thoát nào trước khi truyền các đối số cho chương trình, do đó, nó diễn giải thành \$một chuỗi thoát và chuyển đối số duy nhất $đến grep, khớp với cuối dòng. Vì mỗi dòng đều có một kết thúc, nên bất kỳ dòng nào cũng phù hợp :)


Nhưng làm thế nào $ là cuối dòng? Không phải là kết thúc của dòng là \ n?

2
@Happy Mithal: Xem man grep; nó đã được quyết định rằng $phù hợp với cuối dòng, bất kể có hay không các dòng được phân cách bằng \n, \rcả, hoặc một cái gì đó hoàn toàn khác nhau. Trong trường hợp chung, các biểu thức chính quy có thể được sử dụng để khớp với bất kỳ chuỗi nào, không chỉ là một dòng trên mạng, và $được sử dụng để khớp với phần cuối của chuỗi.

2

Nó đang được hiểu là metacharacter cuối dòng. Nếu bạn muốn khớp với ký hiệu đô la thực tế, hãy làm

 $ grep \\$ 

hoặc là

 $ grep '\$' 

1

^là để bắt đầu chuỗi, và $kết thúc.

grep \$

hoặc là

grep $

sẽ khớp với mọi chuỗi, vì vậy bất cứ điều gì bạn gõ đều được lặp lại.

Thử

grep a$

Bây giờ, chỉ các chuỗi có ký tự cuối cùng asẽ được khớp và lặp lại .


1

Bạn có thể lưu các rắc rối của việc thoát nếu bạn muốn tìm kiếm một nghĩa đen $, bằng cách sử dụng biểu thức chính quy cho lớp nhân vật. Ví dụ,

$ grep '[$]' file
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.