ทั้งนี้ขึ้นอยู่กับสิ่งที่คุณทำและไม่ทราบล่วงหน้าเกี่ยวกับสิ่งที่pip
จะออกคุณอาจตัดสินใจที่จะหาสิ่งอื่นที่ไม่ใช่grep
/usr.*
หากคุณรู้ว่าไดเรกทอรีเริ่มต้นด้วย/usr
(และปรากฏที่ท้ายบรรทัดผลลัพธ์จากpip
นั้นและ/usr
จะไม่ปรากฏที่ใดก็ได้ในบรรทัดก่อนชื่อไดเรกทอรี) นั่นคือตัวเลือกที่ดี คำตอบของ heemaylจะบอกคุณว่า
ถ้าเหตุผลที่คุณรู้ว่ามันเริ่มต้นด้วยคือการที่คุณมีเพียงแค่เรียกใช้คำสั่งและทราบไดเรกทอรีที่คุณต้องการที่จะเปลี่ยนแปลงผมขอแนะนำวิธีการแก้ปัญหาที่ง่ายของการใช้คำสั่ง/usr
cd /usr/lib64/python2.7/site-packages
นี้เป็นพิมพ์น้อยแม้ว่าคุณจะไม่ได้ใช้ประโยชน์จากเสร็จสิ้นแท็บ
มิฉะนั้นคุณอาจเลือก regexp อื่นขึ้นอยู่กับสิ่งที่คุณรู้เกี่ยวกับผลลัพธ์ที่ถูกแยกวิเคราะห์ ตัวเลือกทั้งหมดด้านล่างยังคงถือว่าชื่อไดเรกทอรีปรากฏที่ท้ายบรรทัด แต่ข้อสมมติอื่น ๆ นั้นแตกต่างกันไป
หากคุณรู้ว่าชื่อไดเรกทอรีนั้นเป็นสัมบูรณ์ (เช่นเริ่มต้นด้วย a /
) และไม่มีชื่อ/
ปรากฏบนบรรทัดหน้าชื่อไดเรกทอรีคุณสามารถใช้ regexp เดียวกันกับคำตอบของ heemaylแต่/
แทนที่จะเป็น/usr
:
cd "$(pip install django | grep -o '/.*')"
ตรงนี้/
ตามด้วยศูนย์หรือมากกว่า ( *
) ของตัวละครใด ๆ ( .
)
หากคุณรู้ว่าชื่อไดเรกทอรีไม่มีช่องว่างแนวนอน (ไม่มีช่องว่างหรือแท็บ) และปรากฏที่ท้ายบรรทัดคุณสามารถใช้:
cd "$(pip install django | grep -oP '[^\h]+$')"
ที่นี่ฉันใช้Perl regexp ( -P
) เพราะ\h
ตัวย่อ (สำหรับ[:blank:]
) ทำให้การพิมพ์และอ่านง่ายกว่า regexp แบบขยายที่เทียบเท่า ( -E
) สิ่งนี้ตรงกับหนึ่งหรือมากกว่า ( +
) ของตัวละครใด ๆ ในคลาสของอักขระ ( [
]
) ที่ไม่ใช่ ( ^
) เว้นวรรคหรือแท็บ ( \h
)
หากคุณรู้ชื่อไดเรกทอรีจะถูกนำหน้าทันทีโดยin
ล้อมรอบด้วยช่องว่างแนวนอน (เช่นมีทั้งด้านซ้ายและด้านขวาด้วยช่องว่าง) และนี่เป็นสิ่งเดียวที่เกิดขึ้นin
บนบรรทัดคุณสามารถใช้:
cd "$(pip install django | grep -oP '\hin\h+\K.+')"
การใช้งานนี้เป็นศูนย์ที่มีความกว้างในเชิงบวกมองอยู่เบื้องหลังยืนยัน ( \K
) เพื่อให้ตรงกับหนึ่งหรือมากกว่าตัวอักษร ( .+
) ที่ปรากฏขึ้นหลังจากที่ช่องว่างหรือแท็บ ( \h
) in
และอีกคนหนึ่งหรือช่องว่างมากขึ้นหรือแท็บ ( \h+
) ไม่จริงรวมทั้งin
และช่องว่าง ล้อมรอบในการแข่งขัน การยืนยันแบบมองไปรอบ ๆเป็นคุณลักษณะหนึ่งของการแสดงออกปกติของ Perl
รูปแบบจะทำงานได้เช่นกัน แต่เราต้องมองหาสิ่งที่ว่างเปล่ามาก่อนโดยไม่คำนึงว่ามีอยู่กี่ตัว ในทางตรงกันข้ามเราต้องจับคู่ช่องว่างทั้งหมดหลังจากนั้นมิฉะนั้นพวกเขาจะไม่ถูกทิ้งและพวกเขาจะถูกจับคู่เป็นส่วนหนึ่งของชื่อไดเรกทอรี\h+in\h+\K.+
in
in
\K
หากคุณรู้ว่าชื่อไดเรกทอรีนั้นนำหน้าด้วยการปรากฏตัวครั้งสุดท้ายของบรรทัดin
ตามด้วยช่องว่างแนวนอนคุณสามารถใช้:
set +H
cd "$(pip install django | grep -oP '\hin\h+(?!.*\hin\h.*)\K.*')"
set -H
ที่นั่นการยืนยันการมองด้านหลังเป็นบวกที่มีความกว้างเป็นศูนย์นั้นมีการยืนยันการมองล่วงหน้าในเชิงลบที่มีความกว้างเป็นศูนย์ ( (?!
)
)
การ!
ปรากฏตัวในลักษณะที่ยากต่อการหลบหนีอย่างหรูหรา; วิธีที่ฉันใช้เพื่อป้องกันไม่ให้เกิดการเรียกใช้การขยายประวัติเชลล์ก่อนที่จะถูกส่งไปยังgrep
คือการปิดใช้งานการขยายประวัติชั่วคราว ( set +H
) ก่อนที่จะเรียกใช้คำสั่งและเปิดใช้งานมันอีกครั้งในset -H
ภายหลัง หากคุณกำลังใช้สิ่งนี้ในสคริปต์และสคริปต์ของคุณไม่มีset -H
คุณไม่จำเป็นต้องทำเช่นนี้เนื่องจากการขยายประวัติถูกเปิดใช้งานโดยอัตโนมัติเฉพาะเมื่อเชลล์ทำงานแบบโต้ตอบ
ในที่สุดโปรดทราบว่าไม่มีคำตอบใด ๆ เหล่านี้หรือคำตอบของ heemayl ที่จริงแล้วไพพ์เอาท์พุทของgrep
ถึงcd
(แม้ว่าเอาต์พุตของpip
ยังคงถูกไพพ์ไปที่grep
) แทนที่จะท่อ , เครื่องมือที่เหมาะสมสำหรับงานนี้เป็นคำสั่งเปลี่ยนตัว