Tìm kiếm Grep trả về một dòng khác


7

Đây là tìm kiếm grep của tôi

 grep 'Invoker_Slark*' true_pairscore.txt

Nhưng nó trả về dòng Invoker_Slardar. Mặc dù tập tin chứa Invoker_Slark. Tại sao vậy?


Bạn đang tìm kiếm các dòng bắt đầu bằng Invoker_Slarkhoặc cho tất cả những gì có chứa nó?
Hauke ​​Laging

@HaukeLaging: Vâng, tôi đã tìm kiếm các dòng bắt đầu với Invoker_Slark. Vì vậy, điều đó có nghĩa là ngay cả Invoker_Slarkaslkjfd cũng là một kết quả hợp lệ. Nhưng không phải Invoker_Slardar.
Ashwin

Quan điểm của tôi là: Mã trong câu trả lời của tôi cũng phù hợp với một dòng foo_Invoker_Slarkaslkjfd. Đó có phải là dự định hoặc đó sẽ là một kết quả không hợp lệ?
Hauke ​​Laging

Câu trả lời:


12

Lý do được Invoker_Slark*coi là một biểu thức chính quy trong đó k*có nghĩa là: "không hoặc nhiều lần xuất hiện của k"

Điều đó khác với các mẫu hình cầu vỏ *có nghĩa là 0 hoặc nhiều ký tự.

Để tìm kiếm Invoker_Slarkbất cứ nơi nào trong dòng, bạn cần:

  1. grep 'Invoker_Slark' true_pairscore.txt hoặc là

  2. grep -x '.*Invoker_Slark.*' true_pairscore.txt

Nếu chuỗi tìm kiếm phải ở đầu dòng thì điều này phải được thay đổi thành:

  1. grep '^Invoker_Slark' true_pairscore.txt hoặc là

  2. grep -x 'Invoker_Slark.*' true_pairscore.txt


Tôi nghĩ rằng * giống như một sự thay thế cho "bất kỳ số lượng ký tự nào theo sau". Tìm kiếm nào có thể lấy cho tôi 2 kết quả này? "Invoker_Slarkasdfd" và "Invoker_Slarkoeirute"
Ashwin

1
@Ashwin: Đó là cho các mẫu toàn cầu, không phải biểu thức chính quy. Glob được sử dụng cho các mẫu vỏ (mở rộng thành tên tệp) và một vài nơi khác. Biểu thức chính quy được sử dụng trong grep('re' in 'grep' là viết tắt của 'biểu thức chính quy') sedvà rất nhiều nơi khác sử dụng các mẫu tìm kiếm. Xem, ví dụ enwp.org/Glob_potypeenwp.org/Regular_expression tương ứng.
Johan E

Đặt .*ở phần cuối của một grepmẫu không có gì ngoại trừ có thể làm chậm quá trình khớp. Nó sẽ không khớp với bất kỳ dòng nào không khớp mà không có .*phần cuối.
Johan E

(tt) Với một mẫu của ^INITIAL, trận đấu có thể được kết thúc sau khi khớp 7 ký tự đầu tiên của mỗi dòng. Với ^INITIAL.*, sau khi khớp 7 ký tự đầu tiên grepphải đi qua phần còn lại của dòng trước khi có thể kết thúc toàn bộ khớp mẫu ( *là 'tham lam', khớp với ký tự chạy dài nhất có thể). Điều này có thể được tối ưu hóa khi .*xuất hiện ở cuối mẫu ...
Johan E

@JohanE Điều đó đúng nhưng ý nghĩa của việc này là một phần trong câu trả lời của tôi không phải là đề xuất theo cách này mà là để hiển thị sự tương tự cho các kết hợp mô hình vỏ *trong biểu thức chính quy. Tôi thừa nhận: Có một sự khác biệt. Shell cần nó vì nó ẩn $( text$so với text.*$). Nhưng thông tin này sẽ hữu ích cho các trường hợp khác.
Hauke ​​Laging
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.