Phân phối chéo câu trả lời an toàn (bao gồm cả windows minGW?)
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
Nếu bạn sử dụng các phiên bản cũ hơn của grep (như 2.4.2) không bao gồm tùy chọn -o. Sử dụng ở trên. Khác sử dụng đơn giản hơn để duy trì phiên bản dưới đây.
Linux phân phối chéo câu trả lời an toàn
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
Để tóm tắt -oh
kết quả, biểu thức chính quy khớp với nội dung tệp (chứ không phải tên tệp của nó), giống như cách bạn mong đợi biểu thức chính quy hoạt động trong vim / etc ... Từ nào hoặc biểu thức chính quy bạn sẽ tìm kiếm sau đó, tùy thuộc vào bạn! Miễn là bạn vẫn duy trì POSIX và không phải cú pháp perl (tham khảo bên dưới)
Thêm từ hướng dẫn cho grep
-o Print each match, but only the match, not the entire line.
-h Never print filename headers (i.e. filenames) with output lines.
-w The expression is searched for as a word (as if surrounded by
`[[:<:]]' and `[[:>:]]';
Lý do tại sao câu trả lời ban đầu không hiệu quả với tất cả mọi người
Việc sử dụng \w
thay đổi từ nền tảng đến nền tảng, như một cú pháp "perl" mở rộng. Như vậy, các cài đặt grep bị giới hạn hoạt động với các lớp ký tự POSIX sử dụng [[:alpha:]]
và không tương đương với perl của nó \w
. Xem trang Wikipedia về biểu thức chính quy để biết thêm
Cuối cùng, câu trả lời POSIX ở trên sẽ đáng tin cậy hơn nhiều bất kể nền tảng (là bản gốc) cho grep
Đối với hỗ trợ của grep không có tùy chọn -o, grep đầu tiên xuất ra các dòng có liên quan, tr chia tách khoảng trắng thành các dòng mới, bộ lọc grep cuối cùng chỉ dành cho các dòng tương ứng.
(PS: Tôi biết hầu hết các nền tảng bây giờ, đã được vá cho \ w .... nhưng luôn có những nền tảng bị tụt lại phía sau)
Tín dụng cho cách giải quyết "-o" từ câu trả lời @AdamRosenfield