जवाबों:
GNU के साथ sed
:
sed 's/./\&&/2g'
( s
ubstitute हर g
) ( ) अक्षर ( .
) उसी के साथ ( &
) से पहले &
( \&
) लेकिन केवल दूसरी घटना से शुरू ( 2
)।
portably:
sed 's/./\&&/g;s/&//'
(हर घटना को प्रतिस्थापित करें, लेकिन फिर पहले को हटा दें &
जो हम नहीं चाहते हैं)।
कुछ awk
कार्यान्वयन के साथ (POSIX नहीं है क्योंकि व्यवहार एक खाली FS के लिए अनिर्दिष्ट है):
awk -F '' -v OFS="&" '{$1=$1;print}'
( gawk
और कुछ अन्य awk
कार्यान्वयनों के साथ, एक खाली फ़ील्ड विभाजक रिकॉर्ड को उसके चरित्र घटकों में विभाजित करता है । आउटपुट फ़ील्ड सेपरेटर ( OFS
) के लिए सेट है &
। हम $1
नए फ़ील्ड इंस्ट्रक्टर के साथ पुन: उत्पन्न होने के लिए रिकॉर्ड करने के लिए बाध्य करने के लिए (स्वयं) के लिए एक मान प्रदान करते हैं। इसे प्रिंट करने से पहले, NF=NF
यह काम भी करता है और कई आवक कार्यान्वयनों में थोड़ा अधिक कुशल होता है, लेकिन जब आप ऐसा करते हैं तो वर्तमान में पोसिक्स द्वारा अनिर्दिष्ट है)।
perl
:
perl -F -lape '$_=join"&",@F'
( -pe
हर पंक्ति के लिए कोड चलाता है, और परिणाम प्रिंट ( $_
); -l
स्ट्रिप्स और लाइन अंत स्वचालित रूप से फिर से कहते हैं, -a
भरता @F
में सीमांकक सेट पर इनपुट विभाजन के साथ -F
।, जो यहाँ एक रिक्त स्ट्रिंग है परिणाम हर चरित्र में विभाजित करने के लिए है @F
, फिर उन्हें 'और' के साथ मिलाएं, और लाइन प्रिंट करें।)
वैकल्पिक रूप से:
perl -pe 's/(?<=.)./&$&/g'
(प्रत्येक वर्ण को बदलें, बशर्ते कि यह किसी अन्य वर्ण (लुक-रेगेक्स ऑपरेटर से पहले से जुड़ा हो? <= ...)
zsh
शेल ऑपरेटरों का उपयोग करना :
in=12345
out=${(j:&:)${(s::)in}}
(फिर, s::
पैरामीटर विस्तार ध्वज का उपयोग करके एक खाली क्षेत्र विभाजक पर विभाजित करें और साथ जुड़ें &
)
या:
out=${in///&} out=${out#?}
( ksh ऑपरेटर &
का उपयोग करके कुछ भी नहीं (इसलिए हर वर्ण से पहले) की जगह लें ${var//pattern/replacement}
(हालांकि ksh
एक खाली पैटर्न का मतलब कुछ और है, और फिर भी कुछ और, मुझे यकीन नहीं है कि क्या है bash
), और POSIX ${var#pattern}
स्ट्रिपिंग के साथ पहले एक को हटा दें ऑपरेटर)।
ksh93
शेल ऑपरेटरों का उपयोग करना :
in=12345
out=${in//~(P:.(?=.))/\0&}
( ~(P:perl-like-RE)
ksh93 ग्लोब ऑपरेटर होने के नाते perl जैसी नियमित अभिव्यक्तियों का उपयोग करना (perl या PCRE के अलग से अलग है), (?=.)
लुक- फॉरवर्ड ऑपरेटर होने के नाते: एक चरित्र को बदलें, बशर्ते वह स्वयं के साथ एक और चरित्र ( \0
) और &
)
या:
out=${in//?/&\0}; out=${out#?}
(हर चरित्र को बदलें ?
) ( &
और खुद के साथ \0
)
bash
शेल ऑपरेटरों का उपयोग करना :
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(उसी रूप में zsh
, सिवाय इसके कि आपको @()
वहां (एक ksh ग्लोब ऑपरेटर जिसके लिए आपको आवश्यकता extglob
है bash
) की आवश्यकता है )।
awk -F '' -v OFS="&" 'NF=NF'
यूनिक्स उपयोगिताओं:
fold -w1|paste -sd\& -
व्याख्या की:
"fold -w1"
- प्रत्येक इनपुट चरित्र को अपनी लाइन में लपेटेगा
गुना - निर्दिष्ट चौड़ाई में फिट होने के लिए प्रत्येक इनपुट लाइन को लपेटें
-w, --width = WIDTH 80 के बजाय WIDTH कॉलम का उपयोग करें
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"
- &
एक विभाजक के रूप में , इनपुट लाइनों को एक साथ मर्ज करेगा
पेस्ट - फ़ाइलों की मर्ज लाइनों
-s, - समानांतर में एक समय में एक फ़ाइल पेस्ट करें
-d, --delimiters = LIST TABs के बजाय LIST से वर्णों का पुन: उपयोग करता है
%fold -w1|paste -sd\& -
1&2&3&4&5
(ध्यान दें कि यदि इनपुट में कई लाइनें हैं, तो वे साथ जुड़ जाएंगे &
)
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
।
sed
नीचे कई अच्छे उत्तर उपलब्ध हैं। और मुझे यह दिखाने में कोई बुराई नहीं है कि कार्य को अन्य तरीकों से कैसे हल किया जा सकता है।
sed 's/\B/\&/g'
\ B - हर जगह मेल खाता है लेकिन एक शब्द सीमा पर; यदि यह मेल खाता है तो बाईं ओर वर्ण और दाईं ओर वर्ण दोनों "शब्द" वर्ण या "गैर-शब्द" वर्ण दोनों हैं।
जानकारी: GNU sed मैनुअल, रेगुलर एक्सप्रेशन एक्सटेंशन ।
परिक्षण:
sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5
यह कुछ अन्य उत्तरों की तुलना में थोड़ा धीमा होगा, लेकिन यह बहुत स्पष्ट है:
echo 12345 | perl -lnE 'say join "&", split //'
यहाँ एक और तरीका है। सीड एक्सप्रेशन का पहला भाग हर कैरेक्टर को कैप्चर करता है और उसके बाद कैरेक्टर और एंपर्सैंड के साथ बदल देता है। दूसरा भाग लाइन के अंत से एम्परसेंड को हटाता है।
echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5
मल्टीबाइट पात्रों पर भी काम करता है।
sed
दो बार कॉल करने की आवश्यकता नहीं , एक sed
स्क्रिप्ट में कई कमांड हो सकते हैं:sed -r 's/(.)/\1\&/g; s/\&$//g'
012345
इनपुट पर काम नहीं करेगा