Sed s / REGEXP / REPLACEMENT / g का निष्पादन चक्र


14

echo ,,, |sed s':\(,\)\(,\):\1*\2:'gपैदावार " ,*,," के बजाय " " क्यों होती है ,*,*,? दूसरे शब्दों में: क्यों, "जी" ध्वज के बावजूद, *एक जोड़ी अल्पविराम के बीच sed नहीं डालता है?

जवाबों:


14

क्योंकि दो ,एस के साथ (,\)\(,\), आप पहले से ही पहले दो ,एस से मेल खा चुके हैं और रेगेक्स पैटर्न का मिलान अब तक बाकी लाइन के लिए नहीं होगा। अब केवल एक ही बचा है जो कि अंतिम है, ,इसलिए इसे अभी-अभी छापा गया है क्योंकि यह इसके *बीच का कोई दूसरा है।

यदि आपके पास एक ,और इनपुट है, तो आपको वांछित (वैश्विक g) प्रतिक्रिया मिलेगी :

% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,

अजीब उद्धरण के साथ क्या है? (क्यों उद्धरण चिह्नों से बाहर निकलें sऔर gबाहर?)
GnP

@ GnP Haha, जो ओपी से विरासत में मिली है।
heemayl

orecho ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot

8

सवाल का जवाब पहले से ही @heemayl द्वारा दिया गया था

वैकल्पिक हल के साथ sed(यहाँ जीएनयू संभालने sed) - पाश रिकर्सिवली जब तक मिलान हो जाता है

$ echo ,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,

$ echo ,,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,*,

POSIXly:

$ echo ,,,, | sed -e :a -e 's/\(,\)\(,\)/\1*\2/; ta'
,*,*,*,

या के साथ perl

$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,

$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.