2011-06-14 9 views
7

Tôi đang cố gắng tìm cách lấy danh sách tên tệp cho tệp có tên BOZO nhưng kết thúc bằng CHỈ 123 HOẶC 456.Chỉ liệt kê một số tệp nhất định trong thư mục khớp với từ BOZO và kết thúc bằng '123' hoặc '456'

tập tin bao gồm:

BOZO12389,
BOZOand3
BOZOand456
BOZOand5
BOZOhello123

Vì vậy, các lệnh chỉ nên hiển thị 'BOZOhello123' và 'BOZOand456'

Tôi không thể tìm ra. Tôi đã thử tất cả các hình thức của LS và GREP mà tôi có thể nghĩ đến. Điều thú vị là, chúng tôi đã cố gắng để làm điều đó trong lớp học khoảng 10 phút và không ai có thể nhận được nó (bao gồm cả người hướng dẫn).

+1

Tôi không thể tin rằng người hướng dẫn sẽ không thể giải quyết việc này quá lâu. –

+0

Xin cảm ơn các bạn! Chúng tôi đã không dành nhiều thời gian cho nó, nhưng vì một lý do nào đó tôi ngay lập tức nghĩ 'grep' và mọi người khác đang cố gắng làm điều đó với 'ls'. Vì vậy, đó là câu hỏi đầu tiên về bài tập về nhà cho đêm đó. – Geordie

Trả lời

0

Điều này không quá khó. Cách ngây thơ nhất là ls thư mục và sau đó grep chỉ cho những gì bạn muốn:

$ ls *BOZO* | grep -e '123$' -e '456$' 
8

Sử dụng những đống vỏ của:

ls BOZO*{123,456} 
+0

Lưu ý, điều này yêu cầu bash, zsh hoặc một trình bao cao cấp khác. Nó không phải là di động và sẽ không hoạt động trong nhiều hệ thống '/ bin/sh'. –

10

tôi sau và nó làm việc

ls BOZO*456 BOZO*123 
+0

Smartass. Tôi LoL'ed. – chrisdowney

2

Sử dụng cụm từ thông dụng để giúp bạn. Lệnh egrep sẽ giúp ích, bởi vì nó sẽ cho phép bạn sử dụng cụm từ thông dụng.

Bạn đang tìm kiếm cho các tập tin của các loại BOZO456 và BOZO123

Một thời gian . là một thẻ hoang dã, cho phép bạn thay thế cho <anything>. * sẽ cho phép bạn lặp lại nó 0 hoặc nhiều lần. Bằng cách đặt khoảng 123 và 456 dấu ngoặc tròn, bạn sẽ mô phỏng một OR.

Vì vậy, bạn muốn bất kỳ ký tự lặp đi lặp lại 0 hoặc nhiều lần, tiếp theo là 123 hoặc 456.

Ví dụ:

egrep "BOZO.*(456|123)" data

Cảm ơn bạn Nathan Fellman cho sự giúp đỡ và chỉnh sửa.

+0

Tôi đã bỏ phiếu này vì nó sai đối với thẻ hoang dã. Trong các biểu thức chính quy '.' thường là ký tự đại diện, và' * 'có nghĩa là" 0 hoặc nhiều lần ", do đó, điều này sẽ khớp với 'BOZ456', 'BOZOOOOOOOO123' vv ... –

+0

Đã sửa lỗi!Cảm ơn những người đứng đầu, và lời xin lỗi của tôi: $ – digerati32

+0

Điều đó vẫn không đúng. Điều này sẽ khớp với 'BOZOa456' và' BOZOx123' nhưng không khớp 'BOZOOO123' hoặc thậm chí' BOZO123'. Những gì bạn cần là "BOZO. * (456 | 123)" –

1

Bạn cũng có thể sử dụng tìm lệnh:

find . \(-name "BOZO*123" -o -name "BOZO*456" \) 
+1

Thao tác này vượt qua trẻ em. Bạn muốn 'tìm. -maxdepth 1 -name "BOZO * 123" -o -name "BOZO * 456" '(trong trường hợp này, dấu ngoặc đơn là không cần thiết). –