Sử dụng grep để tìm kiếm một chuỗi có dấu chấm trong đó


193

Tôi đang cố gắng tìm kiếm một chuỗi 0.49(có dấu chấm) bằng lệnh

grep -r "0.49" *

Nhưng điều xảy ra là tôi cũng nhận được kết quả không mong muốn có chứa chuỗi 0449, 0949v.v. Vấn đề là linux coi dot (.) Là bất kỳ ký tự nào và đưa ra tất cả các kết quả. Nhưng tôi muốn nhận kết quả chỉ với "0,49".

Câu trả lời:


233

grepsử dụng biểu thức chính quy; .có nghĩa là "bất kỳ nhân vật" trong một regex. Nếu bạn muốn có một chuỗi chữ, sử dụng grep -F, fgrephoặc thoát khỏi .đến \..

Đừng quên bọc chuỗi của bạn trong dấu ngoặc kép. Hoặc nếu không bạn nên sử dụng\\.

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

grep -r "0\.49" *

hoặc là

grep -r 0\\.49 *

hoặc là

grep -Fr 0.49 *

58
Tôi cần phải thoát hai lần như vậy \\.để nó hoạt động. Tôi đang sử dụng zsh.
Nikos Renieris

5
@NikosRenieris bạn đã quấn chuỗi grepping của mình bằng dấu ngoặc kép?
Justus Romijn

@JustusRomijn Tôi nghĩ rằng tôi đã làm, vâng.
Nikos Renieris

15
bạn cũng sẽ cần sử dụng \\.cho bash hoặc sử dụng "\."để thoát khỏi vỏ.
Tomofumi

36

grep -F -r '0.49' *coi 0,49 là một chuỗi "cố định" thay vì một biểu thức thông thường. Điều này làm .mất đi ý nghĩa đặc biệt của nó.


22

Bạn cần phải thoát khỏi .như "0\.49".

A .là một siêu ký tự regex để khớp với bất kỳ ký tự nào (ngoại trừ dòng mới). Để phù hợp với một thời kỳ theo nghĩa đen, bạn cần phải thoát khỏi nó.



5

Bạn cũng có thể dùng "[.]"

grep -r "0[.]49"

4

Dấu chấm thoát. Lệnh mẫu sẽ được.

grep '0\.00'

4

Bạn có thể thoát dấu chấm và các ký tự đặc biệt khác bằng \

ví dụ. grep -r "0 \ .49"


Một lời nhắc nhở cho người đọc trong tương lai, \.bao quanh với dấu ngoặc kép là cần thiết để làm cho nó hoạt động.
Quả

4

Có rất nhiều câu trả lời ở đây đề nghị thoát khỏi dấu chấm đó \.nhưng tôi đã gặp vấn đề này nhiều lần: \.cho tôi kết quả tương tự như.

Tuy nhiên, hai biểu thức này hoạt động với tôi:

$ grep -r 0\\.49 *

Và:

$ grep -r 0[.]49 *

Tôi đang sử dụng shell bash "bình thường" trên Ubuntu và Archlinux.


3
Bạn cần trích dẫn regex từ shell hoặc thoát khỏi dấu gạch chéo ngược để shell không tiêu thụ nó. grep '\.'hoặc grep \\.(tôi thực sự muốn giới thiệu trước đây. Dấu ngoặc kép cũng hoạt động, như trong câu hỏi ban đầu; nhưng dấu ngoặc đơn dễ hiểu và dễ sử dụng hơn. Ví dụ, với dấu ngoặc kép, bạn vẫn cần tăng gấp đôi dấu gạch chéo ngược trong một số trường hợp ).
tripleee 7/07/18

IMHO, đây là câu trả lời đúng rõ ràng nhất, với nhận xét của @tripleee thì đó là câu trả lời đầy đủ nhất. việc sử dụng [] (có chức năng đại diện cho một tập hợp con các ký tự để khớp với một ký tự) là một cách hay.
jringoot

@jringoot Nghiêm túc? Tôi nghĩ rằng điều này không rõ ràng chút nào - nó trông giống như một câu hỏi tiếp theo từ một người không quen thuộc với trích dẫn.
tripleee

Rõ ràng bởi vì cả hai biểu thức hoạt động trực tiếp và thực sự nhiều người khác giả định trích dẫn hoặc cần phải thoát gấp đôi để tránh sự giải thích thứ cấp bởi vỏ là tầm thường. Tôi không thể thay đổi nhận xét nữa (giới hạn 5 phút). Nhận xét của tôi có thể tốt hơn: "điều này, nếu kết hợp với nhận xét của @tripleee thì đó là câu trả lời đầy đủ nhất. Bởi vì cả hai lệnh đều hoạt động ngay lập tức và với trích dẫn là hoàn thành"
jringoot

1
Điều tôi thường khuyên là "luôn trích dẫn các biểu thức chính quy của bạn". Nó không "hoàn thành" nhưng nó hoàn thành công việc và ngụ ý bạn cần phải hiểu trích dẫn hoặc sống theo quy tắc đơn giản này.
tripleee

0

Bạn cũng có thể tìm kiếm với - tùy chọn về cơ bản bỏ qua tất cả các ký tự đặc biệt và nó sẽ không được giải thích bởi grep.

$ cat foo |grep -- "0\.49"
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.