मुझे आश्चर्य है कि किसी ने भी स्पष्ट bashसमाधान का उपयोग करने का उल्लेख नहीं किया है whileऔरread ।
while read -n1 character; do
echo "$character"
done < <(echo -n "$words")
echo -nविलुप्त होती नईलाइन से बचने के उपयोग पर ध्यान दें । printfएक और अच्छा विकल्प है और आपकी विशेष आवश्यकताओं के लिए अधिक उपयुक्त हो सकता है। अगर आप व्हाट्सएप को इग्नोर करना चाहते हैं तो रिप्लेस कर दें"$words" साथ "${words// /}"।
एक और विकल्प है fold । कृपया ध्यान दें कि इसे कभी भी लूप में नहीं खिलाया जाना चाहिए। बल्कि, कुछ समय के लिए लूप का उपयोग करें:
while read char; do
echo "$char"
done < <(fold -w1 <<<"$words")
बाहरी foldकमांड ( कोरुटिल्स पैकेज) का उपयोग करने का प्राथमिक लाभ संक्षिप्तता होगा। आप इसे किसी अन्य कमांड जैसे आउटपुट xargs( खोजक का हिस्सा) के लिए फ़ीड कर सकते हैं पैकेज ) को निम्नानुसार हैं:
fold -w1 <<<"$words" | xargs -I% -- echo %
आप echoऊपर दिए गए उदाहरण में प्रयुक्त कमांड को उस कमांड से बदलना चाहेंगे जिसे आप प्रत्येक वर्ण के विरुद्ध चलाना चाहते हैं। ध्यान दें किxargs डिफ़ॉल्ट रूप से व्हाट्सएप छोड़ देगा। आप -d '\n'उस व्यवहार को अक्षम करने के लिए उपयोग कर सकते हैं ।
अंतर्राष्ट्रीयकरण
मैंने अभी-अभी परीक्षण किया है fold कुछ एशियाई पात्रों के साथ और महसूस किया कि इसमें यूनिकोड का समर्थन नहीं है। जब तक यह ASCII की जरूरतों के लिए ठीक है, तब तक यह सभी के लिए काम नहीं करेगा। उस मामले में कुछ विकल्प हैं।
मैं शायद fold -w1एक awk सरणी से बदलूंगा:
awk 'BEGIN{FS=""} {for (i=1;i<=NF;i++) print $i}'
या grepकिसी अन्य उत्तर में उल्लिखित कमांड:
grep -o .
प्रदर्शन
FYI करें, मैंने 3 उपर्युक्त विकल्पों को बेंचमार्क किया। पहले दो तेज थे, लगभग बांधने वाले, जबकि लूप की तुलना में थोड़ा तेजी से लूप। अप्रत्याशित रूप xargsसे सबसे धीमा था ... 75x धीमा।
यहाँ (संक्षिप्त) परीक्षण कोड है:
words=$(python -c 'from string import ascii_letters as l; print(l * 100)')
testrunner(){
for test in test_while_loop test_fold_loop test_fold_xargs test_awk_loop test_grep_loop; do
echo "$test"
(time for (( i=1; i<$((${1:-100} + 1)); i++ )); do "$test"; done >/dev/null) 2>&1 | sed '/^$/d'
echo
done
}
testrunner 100
यहाँ परिणाम हैं:
test_while_loop
real 0m5.821s
user 0m5.322s
sys 0m0.526s
test_fold_loop
real 0m6.051s
user 0m5.260s
sys 0m0.822s
test_fold_xargs
real 7m13.444s
user 0m24.531s
sys 6m44.704s
test_awk_loop
real 0m6.507s
user 0m5.858s
sys 0m0.788s
test_grep_loop
real 0m6.179s
user 0m5.409s
sys 0m0.921s