Cách sử dụng grep cho 2 dòng khác nhau


15

Làm cách nào tôi có thể tìm kiếm hai cụm từ khác nhau khi chúng ở trên hai dòng khác nhau bằng cách sử dụng một greplệnh duy nhất ?

Ví dụ

Dòng 1: Đây là một ngọt ngào.

Dòng 2: chanh.

Tôi đã sử dụng nhưng không có kết quả

grep "sweet.*lemon" file_type

Câu trả lời:


20

Để sử dụng grepcho hai dòng khác nhau, tìm kiếm cả hai mẫu

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

Hoặc sử dụng xen kẽ

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

Để có được dòng tiếp theo sau một mẫu, bạn có thể sử dụng tùy chọn ngữ cảnh

$ grep -A1 sweet file_type
This is a sweet
lemon.

Nhưng nếu bạn đang tìm kiếm một cách rõ ràng cho một mô hình multiline, đó là bởi vì khó grepnghĩ trong dòng ... . Bạn .*sẽ nắm bắt mọi thứ giữa "ngọt" và "chanh" trên đường dây . Chúng ta có thể lấy "chanh" trên dòng tiếp theo bằng -Pcách sử dụng \nđể khớp với dòng mới và bằng cách nói greptệp bị tách biệt với -z:

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

Ghi chú:

  • -ESử dụng các biểu thức chính quy mở rộng (để sử dụng |ký tự thay thế mà không cần phải thoát nó)
  • -An In các dòng bổ sung sau mẫu, trong đó n là số lượng dòng để in
  • -PSử dụng các biểu thức chính quy theo kiểu perl ("thử nghiệm" trong grep- cài đặt pcregrepthay thế để hỗ trợ regex perl tốt hơn)
  • -zSử dụng ký tự null làm dấu phân cách (chỉ giả vờ trong trường hợp này, nhưng grepsẽ lấy từ của chúng tôi cho nó)
  • -o chỉ in phần phù hợp

Mặc dù grep -zPlệnh sẽ hoạt động trong trường hợp cụ thể này (một tệp bao gồm chính xác hai dòng), nhưng nhìn chung, nó sẽ coi bất kỳ tệp phân tách dòng mới thông thường nào là một dòng, do đó, bỏ toàn bộ nội dung tệp (nếu có khớp ở đâu đó) hoặc không có gì; thông thường đó không phải là những gì mọi người sử dụng grepcho.
Marc van Leeuwen

vâng, điều này chỉ hữu ích với -o... đã chỉnh sửa ...
Zanna

Trong trường hợp điều này được thử trên các bản phát hành khác, bạn có thể gặp phải: grep: The -P and -z options cannot be combined- ví dụ: grep (GNU grep) 2.5.1 trên RHEL
Jason Pyeron

6

Như thế này:

grep "sweet\|lemon"

xin lỗi nhưng điều này sẽ khớp chính xác "ngọt | chanh"

4
@KasiyA Dòng này hoạt động tốt. grepbởi việc làm mặc định trong "chế độ tiêu chuẩn", trong đó "nhân vật đặc biệt" như |, +, *được hiểu theo nghĩa đen trừ khi họ đang đeo mặt nạ với một dấu gạch chéo. Xem ví dụ câu trả lời này . Để sử dụng cách mà bạn có thể đã quen, "các ký tự đặc biệt" cần được che dấu để được hiểu theo nghĩa đen, bạn cần chuyển sang "chế độ mở rộng" ( grep -E). Có lẽ madneon có thể giải thích thêm một chút về câu trả lời của mình, ví dụ những gì OP thử sẽ phù hợp?
Henning Kockerbeck
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.