2010-08-07 12 views
15

मैं कैसे फ़ाइल नाम की एक कॉलन से अलग की गई स्ट्रिंग में इस तरह केग्लोबिंग विभाजक के रूप में पेट के साथ/पथ विस्तार

/var/lib/gems/*/bin 

के रूप में स्ट्रिंग वाली ग्लोब पात्रों में बदल सकते हैं (अर्थात पथ संगत) पैटर्न से मेल खाते?

अर्थात echo /var/lib/gems/*/bin

/var/lib/gems/1.8/bin /var/lib/gems/1.9.1/bin 

मैं

/var/lib/gems/1.8/bin:/var/lib/gems/1.9.1/bin 

चाहते बजाय वापस आ जाएगी।

स्पष्ट दृष्टिकोण अंतरिक्ष चरित्र को 0 :के माध्यम से ':' के साथ प्रतिस्थापित करने के लिए है, लेकिन फ़ाइल नाम में अंतरिक्ष वर्ण होने पर यह काम नहीं करता है।

उत्तर

16

वास्तव में, मैंने एक बेहतर समाधान के बारे में सोचा: एक शैल फ़ंक्शन का उपयोग करें।

function join() { 
    local IFS=$1 
    shift 
    echo "$*" 
} 

mystring=$(join ':' /var/lib/gems/*/bin) 
2
printf "%s\n" /var/lib/gems/*/bin | tr "\n" ":" 
+0

बंद करें! लेकिन अगर केवल एक मैच है, तो आप अंत में एक कोलन प्राप्त करते हैं: "/var/lib/gems/1.9.1/bin:"। (और यदि कोई मिलान नहीं है, एक एकल कोलन।) – mjs

7

यह यह तुम्हारे लिए क्या करना चाहिए:

dirs=(/var/lib/gems/*/bin) # put filenames (dirnames) in an array 
saveIFS=$IFS IFS=':'   # set the Internal Field Separator to the desired delimiter 
dirs=("${dirs[*]}")   # convert the array to a scalar with the new delimiter 
IFS=$saveIFS     # restore IFS 
4
PATH="$(printf "%s:" /usr/*/bin)" 
PATH="${PATH%:}" 
+1

यह काम करता है, लेकिन मैं एक अलग चर का उपयोग करता हूं। आप इस तरह से इनलाइन असाइनमेंट भी कर सकते हैं: 'printf -v varname "% s:"/var/lib/gems/*/bin' –

+0

लगभग बिल्कुल सही। मुझे लगता है कि मुझे पीछे के कोलन को हटाने के लिए पाइपिंग पसंद है, हालांकि एला http://stackoverflow.com/a/5074995/69002 –

2

यह बहुत तुच्छ है कि अगर आप पर्ल में छोड़:

perl -e 'print join ":", @ARGV' /var/lib/gems/*/bin 

या अजगर:

python -c 'import sys; print ":".join(sys.argv[1:])' /var/lib/gems/*/bin 

या अन्य लोकप्रिय स्क्रिप्टिंग भाषाओं की संख्या।

+0

ऐसा लगता है कि यह समग्र रूप से सबसे अच्छा दृष्टिकोण हो सकता है (आईएफएस फिडलिंग थोड़ा गन्दा है), हालांकि बाहरी कार्यक्रम का उपयोग करना एक शर्म की बात है ... – mjs

+0

निश्चित रूप से जाने का तरीका यदि आप एक लाइनर चाहते हैं – mdup

0

एक और oneliner: printf "%s\n" /var/lib/gems/*/bin | paste -s -d':'

लेकिन @ टीमो के जवाब मेरी राय में बेहतर है।

संबंधित मुद्दे