मैंने कुछ अन्य पाइपिंग बैश स्ट्रिंग हेरफेर प्रश्न पढ़े हैं, लेकिन वे विशेष अनुप्रयोग प्रतीत होते हैं।
अनिवार्य रूप से, वहाँ नीचे सरल करने के लिए एक रास्ता है?
के बजाय
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
कुछ इस तरह
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
अगर मैं गति को बनाए रखने के लिए संभव हो तो बैश जोड़-तोड़ के भीतर रहने में दिलचस्पी रखता हूं (जैसा कि sed / awk के विपरीत जो मेरी लिपियों को बहुत धीमा करने की प्रवृत्ति है)
Edit2: @ जिमीज
मुझे दूसरा उदाहरण पसंद आया और मुझे एक समारोह बनाने के लिए प्रेरित किया।
bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD
tr
, तो मैनुअल कहें , तो इसके विपरीत सच है क्योंकि प्रक्रियाओं के स्पैनिंग का समय स्ट्रिंग हेरफेर के समय की तुलना में नगण्य है। sed
और awk
समर्पित हैं। यदि स्ट्रिंग बहुत लंबी है, तो पूरे बैश मैनुअल का कहना है, तो बैश सिर्फ कुछ आंतरिक सीमाओं के कारण, पूरी तरह से आगे बढ़ने से इनकार कर सकता है।
sed
, awk
, tr
या इसी तरह की। Gena2x उत्तर को देखें, जिसे मैंने कुछ समय पहले इस जानकारी को जोड़ते हुए संपादित किया था: unix.stackexchange.com/questions/162221/… आप इसे टेर्डन जवाब के साथ उसी प्रश्न के साथ तुलना करना चाह सकते हैं जहां वह छोटे तारों के लिए समय देता है जिसमें मामले की प्रक्रिया में ज्यादातर समय लगता है। आप इसे स्वयं परीक्षण कर सकते हैं और परिणाम पोस्ट कर सकते हैं।
read x; echo $x
प्रदर्शन के लिए बेहतर है? वाक्यविन्यास किसी भी छोटे या क्लीनर नहीं दिखता है। x=${x// /_}; x=${x^^}
के रूप में एक ही बात करने के लिए एक बहुत अधिक संक्षिप्त तरीका है {read x; echo ${x...
। जहां तक प्रदर्शन की बात है, @jimmij ने कहा है कि tr
/ sed
तेजी से होगा bash
, कांटा गिनती बराबर जा रहा है। एक पाइप का उपयोग हमेशा एक अतिरिक्त प्रक्रिया में होता है इसलिए एक कांटा को बचाने का तर्क अब लागू नहीं होता है। इस प्रकार, यदि आप पाइप का उपयोग कर रहे हैं, तो बस का उपयोग करें sed
/ tr
आदि। यदि आप इसे बैश में कर सकते हैं, तो ऐसा करें और इस read x; echo $x
बकवास को छोड़ दें ।