Veya daha genel olarak, bir Bash ortam değişkeninde iki nokta üst üste işaretiyle ayrılmış bir listeden bir öğeyi nasıl kaldırırım?
Yıllar önce Bash değişken genişlemesinin daha gelişmiş biçimlerini kullanarak bunu yapmanın basit bir yolunu gördüğümü sanıyordum, ama eğer öyleyse, izini kaybettim. Hızlı bir Google araması, şaşırtıcı derecede az sayıda alakalı sonuç ortaya çıkardı ve benim "basit" veya "zarif" diyeceğim hiçbiri yoktu. Örneğin, sırasıyla sed ve awk kullanan iki yöntem:
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)
Açıkça hiçbir şey yok mu? Bash'de split () işlevine benzer bir şey var mı?
Güncelleme:
Kasıtlı olarak belirsiz olan sorum için özür dilemem gerekiyor gibi görünüyor; İyi bir tartışmayı kışkırtmaktansa, belirli bir kullanım durumunu çözmekle daha az ilgileniyordum. Neyse ki anladım!
Burada çok akıllıca teknikler var. Sonunda, aşağıdaki üç işlevi araç kutuma ekledim. Sihir, büyük ölçüde Martin York'un awk
RS değişkenini akıllıca kullanmasına dayanan path_remove'da gerçekleşir .
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/:$//'`; }
Buradaki tek gerçek sorun, sed
takip eden iki nokta üst üste kaldırmak için kullanılmasıdır. Martin'in çözümünün geri kalanının ne kadar basit olduğunu düşünürsek, onunla yaşamaya oldukça istekliyim!
İlgili soru: Kabuk betiklerinde $ PATH öğelerini nasıl işlerim?
WORK=`echo -n ${1} | awk -v RS=: -v ORS=: '$0 != "'${3}'"' | sed 's/:$//'`; eval "export ${2}=${WORK}"
ancak bunu şöyle adlandırmalısınızfunc $VAR VAR pattern
(@ martin-york ve @ andrew-aylett'e göre)