Bạn có chắc chắn những gì bạn muốn đang xảy ra? Khi bạn chạy, ls /directory | grep '[^term]'
về cơ bản bạn đang grepping không phải là chữ ter m. Điều này có nghĩa là nếu một tệp có các chữ cái khác trong tên của nó thì nó vẫn sẽ xuất hiện trong đầu ra của ls
. Lấy thư mục sau đây chẳng hạn:
$ ls
alpha brave bravo charlie delta
Bây giờ nếu tôi chạy, ls |grep '^[brav]'
tôi nhận được như sau:
$ ls |grep '^[brav]'
alpha
brave
bravo
Như bạn có thể thấy, tôi không chỉ nhận được brave
và bravo
tôi còn nhận được alpha
bởi vì lớp nhân vật []
sẽ nhận được bất kỳ chữ cái nào từ danh sách đó.
Do đó, nếu tôi chạy, ls |grep '[^brav]'
tôi sẽ nhận được tất cả các tệp không chứa các ký tự dũng cảm ở bất cứ đâu trong tên.
$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta
Nếu bạn nhận thấy nó bao gồm toàn bộ danh sách thư mục vì tất cả các tệp có ít nhất một chữ cái không được bao gồm trong lớp ký tự.
Vì vậy, như Kanvuanza đã nói, để grep cho nghịch đảo của "thuật ngữ" trái ngược với các ký tự t e r m
bạn nên làm điều đó bằng cách sử dụng grep -v
.
Ví dụ:
$ ls |grep -v 'brav'
alpha
charlie
delta
Ngoài ra nếu bạn không muốn các tệp có bất kỳ ký tự nào trong lớp sử dụng grep -v '[term]'
. Điều đó sẽ giữ cho bất kỳ tệp nào hiển thị có bất kỳ ký tự nào trong số đó. (Câu trả lời của Kanvuanza)
Ví dụ:
$ ls |grep -v '[brav]'
Như bạn có thể thấy không có tệp nào được liệt kê vì tất cả các tệp trong thư mục này bao gồm ít nhất một chữ cái từ lớp đó.
Phụ lục:
Tôi muốn thêm rằng sử dụng PCRE, có thể sử dụng chỉ regex để lọc ra bằng cách sử dụng các biểu thức phủ định. Để làm điều này, bạn sẽ sử dụng một cái gì đó được gọi là regex tiêu cực về phía trước : (?!<regex>)
.
Vì vậy, bằng cách sử dụng ví dụ trên, bạn có thể làm một cái gì đó như thế này để có được kết quả bạn muốn mà không cần sử dụng grep
cờ.
$ ls | grep -P '^(?!brav)'
alpha
charlie
delta
Để giải cấu trúc biểu thức chính đó, trước tiên, nó khớp với phần đầu của một dòng ^
và sau đó tìm các chuỗi không khớp brav
để theo sau. Chỉ alpha
, charlie
và delta
phù hợp để đó là những người duy nhất được in.
grep
dòng bắt đầu với hạn. Hay bạn muốn grep cho các dòng không chứa thuật ngữ nào cả?