Ne yapacağınıza ve neyin pip
çıkacağına dair önceden bilmediğinize bağlı olarak, grep
başka bir şey için karar verebilirsiniz /usr.*
.
Biliyorsanız dizin başlar/usr
(ve ondan çıktı hattının sonunda görünen pip
ve bu /usr
dizin adından önce satırda herhangi bir yerde görünmüyor), o İyi bir seçim; heemayl'ın cevabı size nasıl yapılacağını anlatır.
Eğer bununla başladığınızı bilmenizin nedeni/usr
sadece komutu çalıştırmanız ve değiştirmek istediğiniz dizini bilmenizdir, komutu çalıştırmanın daha basit bir çözümünü öneririm cd /usr/lib64/python2.7/site-packages
. Sekme tamamlama özelliğini kullanmasanız bile bu daha az yazımdır .
Aksi takdirde, ayrıştırılmakta olan çıktı hakkında bildiklerinize bağlı olarak farklı bir normal ifade seçebilirsiniz. Aşağıdaki tüm alternatifler hala dizin adının satırın sonunda göründüğünü varsayar, ancak diğer varsayımlar değişir.
Biliyorsanız dizin adı mutlaktır (yani bir ile başlar /
) ve hiçbir /
dizin adından önce on line görünür , sen aynı Regexp'i kullanabilirsiniz heemayl cevabı fakat /
yerine /usr
:
cd "$(pip install django | grep -o '/.*')"
Bu , herhangi bir karakterin ( ) /
ardından sıfır veya daha fazla ( *
) ile eşleşir .
.
Biliyorsanız dizin adı hiçbir yatay boşluk içeriyor (boşluk veya sekme) ve satırın sonunda görünür , şunları kullanabilirsiniz:
cd "$(pip install django | grep -oP '[^\h]+$')"
Burada bir Perl regexp ( -P
) kullandım çünkü \h
(for [:blank:]
) kısaltması bu yazmayı ve okumayı eşdeğer bir genişletilmiş regexp ( -E
) ' den daha kolay hale getirir . Bu, bir veya daha fazla (maçları +
) karakterden oluşan bir sınıfı (içinde herhangi bir karakterin [
]
olduğu) değil ( ^
) bir boşluk veya sekme ( \h
).
Eğer t biliyorsanız o dizin adı derhal öncesinde in
yatay boşluk ile çevrili (yani sol ve sağ boşluklar içeren hem yastıklı) ve bu bu sadece böyle bir durumdur in
satırda , şunları kullanabilirsiniz:
cd "$(pip install django | grep -oP '\hin\h+\K.+')"
Bu, boşluk veya sekmeden ( ) sonra görünen \K
bir veya daha fazla karakteri ( .+
) ve gerçekte boşluklar içermeyen ve boşluklar olmadan başka bir veya daha fazla boşluk veya sekmeyi ( ) eşleştirmek için sıfır genişliğinde pozitif bir görünüm ( ) kullanır maçta onu çevreliyor. Etrafa bakma iddiaları Perl düzenli ifadelerinin bir özelliğidir.\h
in
\h+
in
Desen de işe yarardı, ancak kaç tane mevcut olduğuna bakılmaksızın daha önce sadece bir boşluk aramamız gerekiyor . Buna karşılık, sonraki tüm boşluklarla eşleşmeliyiz , aksi takdirde atılmazlar ve dizin adının bir parçası olarak eşleştirilirler.\h+in\h+\K.+
in
in
\K
Biliyorsanız dizin adı hemen hattın öncesinde son oluşumu in
yatay Arkasında boşluk , şunları kullanabilirsiniz:
set +H
cd "$(pip install django | grep -oP '\hin\h+(?!.*\hin\h.*)\K.*')"
set -H
Burada sıfır genişlikli pozitif geriye dönük iddianın kendisi, sıfır genişlikli bir negatif ileriye dönük iddia ( (?!
)
) içerir.
!
Zor diye bir biçimde görünür kaçmak için zarif; aktarılmadan önce kabuk geçmişi genişletmesini tetiklemesini önlemek için kullandığım yöntem , komutu çalıştırmadan önce grep
geçmiş genişletmeyi ( set +H
) geçici olarak devre dışı bırakmak ve set -H
daha sonra yeniden etkinleştirmek ( ). Bunu bir komut dosyasında kullanıyorsanız ve komut dosyanız içermiyorsa set -H
, yalnızca bir kabuk etkileşimli olarak çalıştığında geçmiş genişletme otomatik olarak etkinleştirildiğinden bunu yapmanız gerekmez.
Son olarak, not bunların hiçbiri, ne de o heemayl cevabı , aslında çıktısının edilmektedir grep
için cd
(çıkış olsa pip
yine yöneltilen ediliyor grep
). Borulardan ziyade , bu iş için uygun araç komut ikamesidir .