मैं अल्पविराम के साथ टैब को प्रतिस्थापित करने के लिए gsub का उपयोग कर रहा हूँ
gsub(/t/,",")
atb will be a,b
कुछ मामलों में मेरे पास एक दूसरे द्वारा अनुमोदित दो टैब हैं उदाहरण के लिए
a/t/tb
उस मामले में जीएसबी इसे बदल देता है a,,b
मैं चाहता हूं कि इस तरह के मामलों में, स्ट्रिंग को एक, -, बी (बीच में एक ऋण चिह्न) में परिवर्तित किया जाना चाहिए।
मैंने दो अलग-अलग gsubs लिखने की कोशिश की
gsub(/t/,",") // for tab
gsub(/,,/,"/,-,/") // for consecutive commas
दूसरा काम नहीं करता है।
इसके साथ गलत क्या है। क्या कोई रास्ता है, मैं दोनों को एक साथ जोड़ सकता हूं gsub
.
उत्तर:
उत्तर № 1 के लिए 1मैं इसे आपसे पूछता हूं "अजीब पूछ रहा हूँ? मुझे नहीं लगता कि यह एक सिंगल जीएसबी के साथ किया जा सकता है, वास्तव में मुझे तीन की जरूरत है:
$ abc=$(echo "a.b..c...d....e.....f" | tr . "t")
$ echo "$abc" | awk "{gsub(/t/, ","); gsub(/,,/, ",-,"); gsub(/,,/, ",-,"); print}"
a,b,-,c,-,-,d,-,-,-,e,-,-,-,-,f
समस्या यह है कि एक सिंगल gsub पर /,,/
दोनों अल्पविरामों का उपभोग करेंगे, इसलिए यह एक अंतर छोड़ देगाकॉमा की अगली जोड़ी के बीच, यदि तीन या अधिक लगातार हैं। एक अधिक शक्तिशाली regexp इंजन, जैसे कि पर्ल, यह एक लुकहेड का उपयोग कर एक ही पास में किया जा सकता है:
$ echo "$abc" | perl -pe "s/t/,/g; s/,(?=,)/,-/g;"
a,b,-,c,-,-,d,-,-,-,e,-,-,-,-,f