Cách đảo ngược biểu thức grep


237

Biểu thức grep sau đây liệt kê thành công tất cả các tệp .exe và .html trong thư mục hiện tại và thư mục con.

ls -R |grep -E .*[\.exe]$\|.*[\.html]$  

Làm cách nào để đảo ngược kết quả này để liệt kê những kết quả không phải là .html hoặc .exe. (Đó là , !=.)

Câu trả lời:


337

Sử dụng tùy chọn dòng lệnh -vhoặc --invert-match,

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$

4
Cần lưu ý rằng -v/ --invert-matchsẽ không nhất thiết phải lật xem mã trả về grepcho biết thực hiện thành công hay không, nhưng thay vào đó sẽ khớp với các dòng mà nếu không sẽ không khớp. Những người đang tìm cách đảo ngược mã trả về (nghĩa là thành công nếu tất cả các dòng không khớp với mẫu, thay vì ít nhất một) nên sử dụng ! grep. Điều này tìm thấy sử dụng trong các biểu thức điều kiện, ví dụ : if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi.
Zyl

98
grep -v

hoặc là

grep --invert-match

Bạn cũng có thể làm điều tương tự bằng cách sử dụng find:

find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)

Thêm thông tin ở đây .


2
Các findlệnh là giải pháp ngữ nghĩa nhất cho vấn đề XY này. Kết hợp lsgrepcho mục đích này có vẻ như hacky tốt nhất. Đây phải là câu trả lời được chấp nhận. (+1)
Eric Seastrand

4
@Eric Bất kể yêu cầu của OP là gì, đảo ngược biểu thức grep rất hữu ích cho việc tìm kiếm tệp. Tôi nghi ngờ đó là lý do hầu hết mọi người đến đây.
byxor

30

Thêm -vtùy chọn vào greplệnh của bạn để đảo ngược kết quả.



7

Như đã nêu nhiều lần, đảo ngược được thực hiện bởi -vtùy chọn để grep. Hãy để tôi thêm ghi chú (hy vọng thú vị) mà bạn có thể tự mình tìm ra điều này bằng cách đọc qua grepvăn bản trợ giúp:

grep --help | grep invert

-v, --invert-match chọn các dòng không khớp

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.