การกำหนดเฉพาะส่วนของสตริงให้กับตัวแปรใน bash


11

ฉันได้รับ filepath แบบสัมบูรณ์จากผู้ใช้และฉันต้องการสร้างตัวแปรที่จะเป็นสตริงที่จะไม่รวมเฉพาะสององค์ประกอบแรกของเส้นทางของไฟล์ แต่ไม่มีการพิมพ์หรืออะไรก็ตาม

ตัวอย่างเช่นพา ธ สัมบูรณ์อาจเป็น:

/home/myusername/folder1/folder2/folder3

และมันถูกบันทึกใน "target_path" และฉันต้องการให้ "mydir" เป็นเพียง:

/folder1/folder2/folder3

ฉันลองใช้คำสั่ง cut ด้วยวิธีที่ต่างกัน แต่ไม่ประสบความสำเร็จ


เป็นไดเรกทอรี/home/usernameจริง$HOMEของผู้ใช้ที่เรียกใช้หรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถลบออกได้โดยใช้mydir="${target_path#$HOME}"ฉันคิดว่า
steeldriver

คำตอบ:


15

ใช้การจัดการสตริงของ bash :

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3

ดังนั้นสตริงที่คุณต้องการจะเป็น (เพิ่มสแลชนำกลับ):

b="/${a#/*/*/}"

สำหรับตัวแปรa, ${a#foo}จะลบจับคู่สตริงที่สั้นที่สุดfooจากจุดเริ่มต้นaของ ดังนั้นเราจึงลบสตริงที่สั้นที่สุดที่มีสาม/(รวมถึงสแลชนำในเส้นทาง) เพื่อลบสององค์ประกอบแรกของเส้นทางที่แน่นอน


เส้นทางอาจเป็น 30 โฟลเดอร์และฉันต้องการรวมเฉพาะ 28 ครั้งล่าสุดสิ่งนี้จะยังใช้งานได้หรือไม่
ชีวิตของ pi

@Lifeofpi ทำไมไม่
muru

9

นี่คือตัวอย่างการใช้ cut

echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4- 

folder1/folder2/folder3

หากคุณต้องการผู้นำ/คุณสามารถต่อ| sed 's/^/\//'ท้ายบรรทัดของคุณ

คุณต้องการ-f4-เพราะ-d '/'บอกcutให้ใช้/เป็นตัวคั่นระหว่างเขตข้อมูล ดังนั้นฟิลด์แรกมาก่อนตัวคั่นแรกในกรณีนี้ฟิลด์แรกจะว่างเปล่า ดังนั้นfolder1ฟิลด์ที่ 4 และ-f4-บอกให้ตัดเพื่อใช้ฟิลด์ทั้งหมดจากลำดับที่ 4 เป็นต้นไป


7

คุณสามารถใช้การขยายพารามิเตอร์ bash ดังนี้:

target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"

หลังจากนี้:

echo $myvar

ให้:

/folder1/folder2/folder3

ทำงานโดยลบการจับคู่ครั้งแรกของรูปแบบ/*/*/จากตัวแปร target_path ของคุณโดยใช้${target_path#pattern}ไวยากรณ์การขยายพารามิเตอร์เชลล์ น่าเสียดายที่สิ่งนี้จะลบ/อักขระตัวแรกซึ่งเป็นสาเหตุที่ต้องรวมอักขระนั้นอย่างชัดเจนขณะตั้งค่าตัวแปร myvar

คำเตือน:คุณควรตรวจสอบว่าตัวแปร target_path ของคุณมีอักขระบางตัวและยาวกว่าสองเซกเมนต์พา ธ ก่อนใช้วิธีนี้ ตัวอย่างเช่นถ้าแล้วtarget_path=/home/username/ ซึ่งอาจเป็นอันตรายต่อระบบของคุณถ้าคุณกำลังใช้งานบางอย่างเช่นmyvar=/ อย่าลองสิ่งนี้!rm -rf "$myvar"*


เส้นทางอาจเป็น 30 โฟลเดอร์และฉันต้องการรวมเฉพาะ 28 ครั้งล่าสุดสิ่งนี้จะยังใช้งานได้หรือไม่
ชีวิตของ pi

แน่นอนว่าสิ่งนี้จะตัดแต่งสองรายการแรกเท่านั้นไม่ว่าเส้นทางนั้นจะมีความยาวเท่าใด
Arronical
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.