หรือโดยทั่วไปฉันจะลบรายการออกจากรายการที่คั่นด้วยโคลอนในตัวแปรสภาพแวดล้อม Bash ได้อย่างไร
ฉันคิดว่าฉันเคยเห็นวิธีง่ายๆในการทำเมื่อหลายปีก่อนโดยใช้รูปแบบการขยายตัวแปร Bash ขั้นสูง แต่ถ้าเป็นเช่นนั้นฉันก็หลงทาง การค้นหา Google อย่างรวดเร็วพบผลลัพธ์ที่เกี่ยวข้องเพียงไม่กี่รายการและไม่มีสิ่งใดที่ฉันจะเรียกว่า "เรียบง่าย" หรือ "หรูหรา" ตัวอย่างเช่นสองวิธีโดยใช้ sed และ awk ตามลำดับ:
PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')
PATH=!(awk -F: '{for(i=1;i<=NF;i++){if(!($i in a)){a[$i];printf s$i;s=":"}}}'<<<$PATH)
ไม่มีอะไรตรงไปตรงมา? มีอะไรที่คล้ายคลึงกับฟังก์ชัน split () ใน Bash หรือไม่?
ปรับปรุง:
ดูเหมือนว่าฉันต้องขอโทษสำหรับคำถามที่คลุมเครือโดยเจตนา ฉันไม่ค่อยสนใจที่จะแก้ปัญหาการใช้งานที่เฉพาะเจาะจงมากกว่าการกระตุ้นให้เกิดการสนทนาที่ดี โชคดีที่ได้มา!
มีเทคนิคที่ชาญฉลาดอยู่ที่นี่ ในท้ายที่สุดฉันได้เพิ่มฟังก์ชั่นสามอย่างต่อไปนี้ในกล่องเครื่องมือของฉัน เวทมนตร์เกิดขึ้นใน path_remove ซึ่งส่วนใหญ่มาจากการใช้awk
ตัวแปร RS อย่างชาญฉลาดของ Martin York
path_append () { path_remove $1; export PATH="$PATH:$1"; }
path_prepend () { path_remove $1; export PATH="$1:$PATH"; }
path_remove () { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }
จุดที่แท้จริงเพียงอย่างเดียวในนั้นคือการใช้sed
เพื่อลบลำไส้ใหญ่ต่อท้าย เมื่อพิจารณาว่าวิธีแก้ปัญหาที่เหลือของ Martin นั้นตรงไปตรงมาแค่ไหนฉันก็เต็มใจที่จะอยู่กับมัน!
คำถามที่เกี่ยวข้อง: ฉันจะจัดการองค์ประกอบ $ PATH ในเชลล์สคริปต์ได้อย่างไร
WORK=`echo -n ${1} | awk -v RS=: -v ORS=: '$0 != "'${3}'"' | sed 's/:$//'`; eval "export ${2}=${WORK}"
แต่คุณต้องเรียกมันว่าfunc $VAR VAR pattern
(อิงตาม @ martin-york และ @ andrew-aylett)