2010-12-30 22 views

Trả lời

15

Tôi nghĩ bạn có thể sử dụng lệnh "dirname". Nó đưa vào đầu vào một đường dẫn tệp, loại bỏ phần tên tệp và trả về đường dẫn. Ví dụ:

$ dirname "/string/to/cut.txt" 
/string/to 
1
echo "/string/to/cut.txt" | awk -F'/' '{for (i=1; i<NF; i++) printf("%s/", $i)}' 
+0

Làm thế nào chúng ta có thể làm điều đó bằng cắt? – user558134

+0

@ user558134 - không chắc chắn cắt hỗ trợ biến cho lĩnh vực cuối cùng, awk là thanh lịch hơn – ajreal

+0

awk giải quyết vấn đề của tôi dễ dàng hơn nhiều và với mã ít hơn, cảm ơn cho tip. –

14

này sẽ làm việc trong các phiên bản hiện đại Bourne như Dash, BusyBox tro, vv, cũng như con cháu như Bash, Korn shell và Z vỏ.

LINE="/string/to/cut.txt" 
LINE=${LINE%/*} 

hoặc để giữ dấu gạch chéo cuối cùng:

LINE=${LINE%/*}/ 
+0

Đây phải là câu trả lời được chấp nhận bởi vì nó là giải pháp nhanh nhất và di động nhất vì nó sẽ hoạt động trong bất kỳ vỏ tuân thủ POSIX nào mà không yêu cầu một 'ngã ba'. –

+0

giải pháp tốt đẹp ... cảm ơn – anon

-1

echo $LINE | grep -o '.*/' làm việc quá.

53

Đối với những gì nó có giá trị, một giải pháp dựa trên cut:

NEW_LINE="`echo "$LINE" | rev | cut -d/ -f2- | rev`/" 
+0

Tôi tin rằng đây là cắt lĩnh vực đầu tiên, không phải là cuối cùng? – Michael

+0

@Michael: Tôi đã chạy qua một số bài kiểm tra ở đây và dường như nó hoạt động tốt. Nó thực sự cắt trường đầu tiên, nhưng nó (thay vì không hiệu quả) đảo ngược chuỗi trước và sau, có hiệu ứng tổng thể mong muốn. –

+5

Tôi có thể xác nhận điều này thực sự làm việc, trong cả hai triển khai cắt Unix và GNU. Rõ ràng câu trả lời dirname là tốt hơn cho các trường hợp sử dụng cụ thể OPs, nhưng tôi thấy điều này khi tìm kiếm một cách chung để thả lĩnh vực cuối cùng với cắt và đây là nó. – jdeuce

Các vấn đề liên quan