Tùy thuộc vào những gì bạn làm và không biết trước về những gì pip
sẽ xuất ra, bạn có thể quyết định grep
cho một cái gì đó khác hơn /usr.*
.
Nếu bạn biết thư mục bắt đầu bằng/usr
(và nó xuất hiện ở cuối dòng đầu ra từ pip
đó và /usr
nó không xuất hiện ở bất kỳ đâu trên dòng trước tên thư mục), thì đó là một lựa chọn tốt; Câu trả lời của heemayl cho bạn biết làm thế nào.
Nếu lý do bạn biết nó bắt đầu /usr
là vì bạn vừa chạy lệnh và biết thư mục bạn muốn thay đổi, tôi đề nghị giải pháp đơn giản hơn là chạy lệnh cd /usr/lib64/python2.7/site-packages
. Đây là cách gõ ít hơn ngay cả khi bạn không sử dụng hoàn thành tab .
Mặt khác, bạn có thể chọn một biểu thức chính quy khác nhau tùy thuộc vào những gì bạn biết về đầu ra được phân tích cú pháp. Tất cả các lựa chọn thay thế bên dưới vẫn giả sử tên thư mục xuất hiện ở cuối dòng, nhưng các giả định khác thì khác.
Nếu bạn biết tên thư mục là tuyệt đối (nghĩa là bắt đầu bằng a /
) và không /
xuất hiện trên dòng trước tên thư mục , bạn có thể sử dụng cùng biểu thức chính quy như trong câu trả lời của heemayl nhưng /
thay vì /usr
:
cd "$(pip install django | grep -o '/.*')"
Điều này khớp với /
số 0 hoặc nhiều hơn ( *
) của bất kỳ ký tự nào ( .
).
Nếu bạn biết tên thư mục không chứa khoảng trắng ngang (không có khoảng trắng hoặc tab) và xuất hiện ở cuối dòng , bạn có thể sử dụng:
cd "$(pip install django | grep -oP '[^\h]+$')"
Ở đây, tôi đã sử dụng một biểu thức chính quy Perl ( -P
) vì \h
chữ viết tắt (for [:blank:]
) giúp việc này dễ đọc và dễ đọc hơn so với biểu thức chính quy mở rộng tương đương ( -E
). Điều này khớp với một hoặc nhiều ( +
) của bất kỳ ký tự nào trong một lớp các ký tự ( [
]
) không phải là ( ^
) một khoảng trắng hoặc tab ( \h
).
Nếu bạn biết tên thư mục của mình ngay lập tức được in
bao quanh bởi khoảng trắng ngang (nghĩa là được đệm ở cả bên trái và bên phải với khoảng trống) và đây là lần xuất hiện duy nhất in
trên dòng , bạn có thể sử dụng:
cd "$(pip install django | grep -oP '\hin\h+\K.+')"
Điều này sử dụng xác nhận nhìn phía sau dương (0 \K
) để khớp với một hoặc nhiều ký tự ( .+
) xuất hiện sau dấu cách hoặc tab ( \h
) in
và một hoặc nhiều khoảng trắng hoặc tab ( \h+
) khác mà không thực sự bao gồm in
và khoảng trắng xung quanh nó trong trận đấu. Các xác nhận nhìn xung quanh là một tính năng của biểu thức chính quy Perl.
Mô hình cũng sẽ hoạt động, nhưng chúng ta chỉ cần tìm một ô trống trước đó , bất kể có bao nhiêu mặt. Ngược lại, chúng ta phải khớp tất cả các khoảng trống sau , nếu không chúng sẽ bị loại bỏ và chúng sẽ được khớp như một phần của tên thư mục.\h+in\h+\K.+
in
in
\K
Nếu bạn biết tên thư mục ngay trước dòng xuất hiện cuối cùng của dòng in
tiếp theo là khoảng trắng ngang , bạn có thể sử dụng:
set +H
cd "$(pip install django | grep -oP '\hin\h+(?!.*\hin\h.*)\K.*')"
set -H
Ở đó, bản thân khẳng định nhìn phía sau dương có độ rộng bằng không chứa khẳng định nhìn phía trước âm (0 (?!
)
).
Sự !
xuất hiện theo cách khó thoát ra một cách thanh lịch; phương pháp tôi đã sử dụng để ngăn nó kích hoạt mở rộng lịch sử shell trước khi được truyền tới grep
là tạm thời vô hiệu hóa mở rộng lịch sử ( set +H
) trước khi chạy lệnh và kích hoạt lại nó ( set -H
) sau đó. Nếu bạn đang sử dụng tập lệnh này trong tập lệnh và tập lệnh của bạn không chứa set -H
, bạn không cần thực hiện việc này vì mở rộng lịch sử chỉ được bật tự động khi trình bao chạy tương tác.
Cuối cùng, lưu ý rằng không ai trong số này, cũng không trả lời heemayl của , đang thực sự đường ống đầu ra của grep
để cd
(mặc dù sản lượng pip
vẫn đang được cấp nước tập trung để grep
). Thay vì đường ống , công cụ thích hợp cho công việc này là thay thế lệnh .