gsub regex पैटर्न - regex, खोल, gsub

मैं अल्पविराम के साथ टैब को प्रतिस्थापित करने के लिए 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