Câu trả lời:
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ư \
và \$
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 grep
cá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ó để grep
sẽ coi đó là nhân vật bình thườ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.
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 :)
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
, \r
cả, 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.
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 '\$'
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
echo \$
và sau đóecho \\$