Hành vi kỳ lạ của người ls -a | grep ^ \.


10

Tôi muốn liệt kê nội dung của một pwd và chỉ hiển thị tệp bắt đầu bằng dấu chấm. Tôi đã thử ls -a | grep ^\.nhưng tôi không thể hiểu tại sao đầu ra cũng chứa các tệp không bắt đầu bằng dấu chấm. Ví dụ:

Pictures
.pip
.pki
.profile
projects
Public

Tôi biết rằng tôi có thể đạt được những gì tôi muốn với ls -ld .*tôi chỉ tò mò về hành vi này của grep mà tôi không thể giải thích.



Tại sao không chỉ ls -d .*để liệt kê tất cả các tập tin bắt đầu với .?
Barmar

Lưu ý cảnh báo: Không bao giờ chuyển đầu ra của ls sang lệnh khác. Sử dụng tìm thay thế. ls có quá nhiều ideosyncrasies đáng tin cậy. Xem: Cạm bẫy 1 tại mywiki.wooledge.org/BashPit thác - nó đã tạo ra số 1! Phần còn lại của trang web là tuyệt vời quá.
Joe

Câu trả lời:


20

Trích dẫn lập luận cho grep, do đóls -a | grep '^\.'

Lý do cho điều này là vỏ xử lý \.và biến nó trở lại đơn giản ., grepsau đó xử lý như một ký tự đại diện một ký tự. Nếu nghi ngờ, luôn trích dẫn một chuỗi chứa (hoặc có thể chứa) một ký tự đặc biệt với vỏ.


Tại sao shell bỏ qua \?
ps-aux

\ là một chuỗi thoát làm cho trình bao để coi ký tự sau là ký tự theo nghĩa đen. Trong trường hợp này grep ^\\., \\ được xử lý bởi shell như một dấu gạch chéo ngược đơn và một lần nữa grep xử lý dấu gạch chéo đơn sau đó là dấu chấm dưới dạng dấu chấm.
Avinash Raj

11

Bạn cần đặt regex grep trong dấu ngoặc kép.

ls -a | grep '^\.'

Lưu ý: Không phân tích đầu ra của lslệnh .


Tại sao nó là xấu khi phân tích đầu ra của ls?
ps-aux

Từ liên kết: Trong chế độ mặc định của nó, nếu đầu ra tiêu chuẩn không phải là thiết bị đầu cuối, ls sẽ phân tách tên tệp với dòng mới. Điều này là tốt cho đến khi bạn có một tập tin với một dòng mới trong tên của nó.
Michael Durrant

@Michael Durrant: Tôi khuyên bạn nên cho phép dòng mới trong tên tệp là một lỗi hệ thống lớn.
jamesqf

@jamesqf - xem dòng mới trong tên tệp (đặc biệt là câu trả lời của sml ).
don_crissti

0

Nếu bạn thực thi cmd ls -a | g ^ ^. sau đó grep không coi "\" là một ký tự đặc biệt và ý nghĩa của "." không được trốn thoát

Khi chúng ta sử dụng cmd ls -a | grep "^ \." sau đó grep coi "\" là một ký tự đặc biệt và ý nghĩa của "." được trốn thoát. Nó sẽ cho bạn một kết quả như mong đợi.

Nếu bạn muốn sử dụng grep cmd mà không có dấu ngoặc kép thì bạn cũng nên thoát ký tự "\". Bạn có thể có kết quả mong đợi mà không cần trích dẫn kép bằng lệnh sau. ls -a | g ^ ^.

Để biết chi tiết về ý nghĩa của các ký tự đặc biệt trong Regex, hãy tham khảo liên kết sau. http://www.THER-expressions.info/quickstart.html

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.