Atau secara lebih umum, bagaimana cara menghapus item dari daftar yang dipisahkan titik dua di variabel lingkungan Bash?
Saya pikir saya telah melihat cara sederhana untuk melakukannya bertahun-tahun yang lalu, menggunakan bentuk yang lebih maju dari ekspansi variabel Bash, tetapi jika demikian saya telah kehilangan jejaknya. Pencarian cepat Google ternyata hanya menemukan sedikit hasil yang relevan dan tidak ada yang saya sebut "sederhana" atau "elegan". Misalnya, dua metode menggunakan sed dan awk, masing-masing:
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)
Apakah tidak ada yang langsung? Apakah ada analogi dengan fungsi split () di Bash?
Pembaruan:
Sepertinya saya perlu meminta maaf atas pertanyaan saya yang sengaja tidak jelas; Saya kurang tertarik untuk menyelesaikan kasus penggunaan tertentu daripada memancing diskusi yang baik. Untungnya, saya mengerti!
Ada beberapa teknik yang sangat pintar di sini. Pada akhirnya, saya telah menambahkan tiga fungsi berikut ke kotak peralatan saya. Keajaiban terjadi di path_remove, yang sebagian besar didasarkan pada penggunaan awk
variabel RS yang cerdas oleh 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/:$//'`; }
Satu-satunya masalah nyata di sana adalah penggunaan sed
untuk menghilangkan tanda titik dua. Mengingat betapa mudahnya solusi Martin lainnya, saya cukup bersedia menerimanya!
Pertanyaan terkait: Bagaimana cara memanipulasi elemen $ PATH dalam skrip shell?
WORK=`echo -n ${1} | awk -v RS=: -v ORS=: '$0 != "'${3}'"' | sed 's/:$//'`; eval "export ${2}=${WORK}"
tetapi Anda harus menyebutnya sebagaifunc $VAR VAR pattern
(berdasarkan @ martin-york dan @ andrew-aylett)