Làm thế nào để grep cho đường ống |


14

Làm cách nào tôi có thể grep cho dòng chứa ký tự ống |hoặc cho ký tự >:

files content:
|this is test
where is >
this is none

bây giờ những gì tôi cần bằng cách sử dụng lệnh grep là

grep -iE "<some expression>" file_name

Đầu ra:

|this is test
where is >

Câu trả lời:


10

Với grepcú pháp chuẩn :

grep '[>|]'

hoặc là

grep -e '>' -e '|'

hoặc là

grep '>
|'

hoặc là

grep -E '>|\|'

6

Nếu bạn đang sử dụng GNU grep, bạn có thể thực hiện việc này với toán tử hoặc toán tử ( |), cần được thoát (trước dấu gạch chéo ngược \). Vì vậy, để tìm các dòng chứa một trong hai đường ống hoặc dấu lớn hơn, hãy bao gồm chúng theo nghĩa đen với toán tử hoặc toán tử:

grep '|\|>' infile

Đầu ra:

|this is test
where is >

4
\|không phải là một BREtoán tử tiêu chuẩn , mặc dù nó hoạt động với GNU grep, thứ được greptìm thấy trong hầu hết các hệ điều hành được xây dựng xung quanh nhân Linux.
Stéphane Chazelas

@StephaneChazelas: cảm ơn bạn đã chỉ ra điều này, tôi đã không nhận thức được nó. Tôi đã sửa văn bản.
Thor

1
Có, toán tử xen kẽ là phép cộng thực sự duy nhất của ERE so với BRE, phần còn lại ( +, ?) là đường cú pháp cho \{1,\}\{0,1\}. (mặt khác, các tham chiếu lỏng lẻo của ERE ( \(.\)\1) chỉ là một tính năng BRE)
Stéphane Chazelas

1

Sử dụng biểu thức ngoặc để khớp với một trong hai ký tự mong muốn:

grep "[|>]" infile

Đầu ra:

|this is test
where is >

3
Không cần một trong hai -ihoặc -Eở đây.
Stéphane Chazelas

Đó là sự thật, thừa nhận.
zagrimsan

0

Cách chính xác để thực hiện nó là sử dụng cờ -e được chỉ định bởi POSIX. Ví dụ:

grep -e '>\||' infile

1
grep -e '>' -e '|' infilelàm việc quá
ott--

2
-eđược chỉ định bởi POSIX nhưng không hữu ích ở đây. \|không được chỉ định bởi POSIX.
Stéphane Chazelas
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.