या अधिक आम तौर पर, मैं एक बैश वातावरण चर में एक औपनिवेशिक-पृथक सूची से आइटम कैसे निकालूं?
मुझे लगा कि मैंने बैश चर विस्तार के अधिक उन्नत रूपों का उपयोग करते हुए इस साल पहले एक सरल तरीका देखा था, लेकिन अगर मैंने इसका ट्रैक खो दिया है। 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)
क्या कुछ भी सीधा नहीं है? क्या बाश में विभाजित () फ़ंक्शन के अनुरूप कुछ है?
अद्यतन:
ऐसा लगता है कि मुझे अपने जानबूझकर अस्पष्ट प्रश्न के लिए माफी माँगने की आवश्यकता है; मैं अच्छी चर्चा को भड़काने की तुलना में विशिष्ट उपयोग के मामले को हल करने में कम रुचि रखता था। सौभाग्य से, मुझे मिल गया!
यहाँ कुछ बहुत ही चतुर तकनीकें हैं। अंत में, मैंने अपने टूलबॉक्स में निम्नलिखित तीन फ़ंक्शन जोड़े हैं। जादू path_remove में होता है, जो काफी हद तक मार्टिन के awk
RS वेरिएबल के चतुर उपयोग पर आधारित है ।
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/:$//'`; }
वहाँ केवल असली cruft वहाँ का उपयोग sed
कर्षण बृहदान्त्र को हटाने के लिए है। यह देखते हुए कि मार्टिन के बाकी समाधान कितने सीधे हैं, हालांकि, मैं इसके साथ रहने के लिए काफी इच्छुक हूं!
संबंधित प्रश्न: मैं शेल स्क्रिप्ट में $ PATH तत्वों का हेरफेर कैसे करूं?
WORK=`echo -n ${1} | awk -v RS=: -v ORS=: '$0 != "'${3}'"' | sed 's/:$//'`; eval "export ${2}=${WORK}"
लेकिन आप इसेfunc $VAR VAR pattern
(@ मार्टिन-यॉर्क और @ -rew-aylett पर आधारित)