कैसे कॉम्ब से अलग स्ट्रिंग्स का उत्पादन बश ब्रेस एक्सपेंशन का उपयोग करके किया जाता है


17

मुझे पसंद है

$ echo a{b,c,d}

जैसे अल्पविराम से अलग सूची का उत्पादन करने के लिए

ab,ac,ad

सामान्य आउटपुट के बजाय

ab ac ad

कमांड लाइन पर ऐसा करने का सबसे आसान तरीका क्या है?

जवाबों:


9

यह मानते हुए कि तत्वों में स्थान नहीं हैं, आप रिक्त स्थान को अल्पविराम में बदल सकते हैं:

echo a{b,c,d} | tr ' ' ,

जो पैदा करता है:

ab,ac,ad

आप वर्णों के साथ श्रेणियाँ भी उपयोग कर सकते हैं:

echo a{b..d} | tr ' ' ,

यदि आप एक बड़ी रेंज चाहते हैं तो यह विशेष रूप से उपयोगी है।


13

ऐसा लगता है कि बैश उत्पन्न शब्दों में शामिल होने के लिए $ IFS का उपयोग नहीं करता है। एक और तकनीक एक सरणी में उत्पन्न शब्दों को संग्रहीत करने के लिए होगी और फिर $ IFS खेल में होगी :

मैं एक सबशेल का उपयोग करने जा रहा हूं, इसलिए मैं इस शेल के IFS में परिवर्तन नहीं करता: एक का चयन करें

( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )

यह कॉमा को अलग करता है स्ट्रिंग को स्टडआउट में। यदि आप इसे कैप्चर करना चाहते हैं:

joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )

यह उत्पन्न शब्दों में शामिल नहीं होता है। यह संपूर्ण बिंदु है, यह शब्दों को अलग करने के लिए फैलता है।
स्टीफन चेजलस


2

आपके द्वारा दिखाए गए तत्वों का विस्तार करें और फिर उन पर लूप करें, सभी अल्पविराम को जोड़ते हुए पहला पुनरावृत्ति:

for i in a{b,c,d}; do
  u="${u:+$u, }$i"
done
echo "$u"

परिणाम:

ab, ac, ad

बैश पैरामीटर प्रतिस्थापन देखें ।


1

यहाँ एक बैश-केवल समाधान है।

(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad

अर्धविराम से पहले का हिस्सा ab ac adवैरिएबल को असाइन करता है INऔर दूसरा भाग सर्च का उपयोग करता है और सभी स्पेस को कॉमा में बदल देता है। //सभी मैचों का मतलब सिर्फ पहले नहीं है।

अपने नामस्थान को प्रदूषित न करने के लिए यह सब एक सब-सब्सक्रिप्शन (एनकोडिंग कोष्ठक) में करें।


1

यह ध्यान देने योग्य है कि कई संदर्भों में, एक अनुगामी अल्पविराम ऐसी सूची में स्वीकार्य है। यदि एक अनुगामी अल्पविराम स्वीकार्य है, तो प्रतिस्थापन को संभालने का सबसे आसान तरीका है printf:

some-command "$(printf %s, a{b,c,d} )"

(जहां some-commandएक कमांड है जो अल्पविराम से अलग की गई सूची पर चलती है, और अनुगामी अल्पविराम की परवाह नहीं करती है।)

वास्तव में, भले ही आपके पास अनुगामी अल्पविराम न हो, जिसका आप उपयोग कर सकते हैं printf; आपको केवल उन तर्कों की संख्या निर्दिष्ट करने की आवश्यकता है जो आप अपेक्षा करते हैं, जो इसे बहुत लंबी सूची के लिए अनाड़ी बनाता है:

some-command "$(printf %s,%s,%s a{b,c,d} )"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.