मैंने मैक ओएस एक्स से बीएसडी सेड पर एक अजीब सा व्यवहार किया है।

sed -e '{s/^/   /;s/\(a*\)/\1b/;}'

तो यह मूल रूप से लाइन की शुरुआत में कुछ रिक्त स्थान जोड़ता है, फिर लगातार 'ए' की किसी भी संख्या को उसी चीज़ के साथ प्रतिस्थापित करता है जिसके बाद बी होता है।

अपेक्षित होना:

|Input    |Output
|a        |   ab
|aa       |   aab
|aaa      |   aaab

वास्तविक:

|Input    |Output
|a        |b   a
|aa       |b   aa
|aaa      |b   aaa

इन दो आदेशों के क्रम को उलटने से अपेक्षित परिणाम प्राप्त होता है। जो काम किया जा रहा है उसकी मेरी समझ यह है कि एक रेखा को पैटर्न स्पेस में पढ़ा जाता है, फिर सभी अभिव्यक्तियों को क्रम में लागू किया जाता है, फिर अगली पंक्ति को पैटर्न स्पेस में पढ़ा जाता है और प्रक्रिया दोहराई जाती है। लगता है कुछ

मैंने भी कोशिश की है

sed -e '{s/^/   /;s/\(a+\)/\1b/;}'

जो रिक्त स्थान जोड़ने के अलावा कुछ भी नहीं करता है।

मेरा प्रश्न यह है कि इस प्रभाव वाली रेखा की शुरुआत को क्यों बदला जा रहा है?

1
JustAnotherSoul 21 सितंबर 2017, 01:07
1
आपका दूसरा रेगेक्स हमेशा स्ट्रिंग की शुरुआत में मेल खाता है। पहला प्रतिस्थापन उसे नहीं बदलता है।
 – 
melpomene
21 सितंबर 2017, 01:11

1 उत्तर

सबसे बढ़िया उत्तर

* का अर्थ है शून्य या अधिक, न कि एक या अधिक। चूंकि शून्य या अधिक a कुछ भी हो सकता है, b को लाइन के ठीक शुरुआत में रखा जाता है - जो कि जल्द से जल्द संभव स्थिति है।

+ को posix रेगुलर एक्सप्रेशन से नहीं समझा जा सकता है, जिनका उपयोग sed द्वारा किया जाता है।


आप उपयोग कर सकते हैं:

sed -e 's/^/   /;s/\(a\{1,\}\)/\1b/;'

\{1,\} का अर्थ है एक या अधिक और सामान्य है, जिसका अर्थ है कि आप इसका उपयोग मेल खाने वाले समूहों के लिए भी कर सकते हैं, जैसे:

\(foo\)\{1,\}

यदि आप एक एकल, दोहराए गए चरित्र की तलाश में हैं तो आप इसका उपयोग कर सकते हैं:

aa*

(मुझे याद दिलाने के लिए धन्यवाद उस पर)

3
hek2mgl 21 सितंबर 2017, 03:34
3
इस मामले में aa* आसान होगा।
 – 
melpomene
21 सितंबर 2017, 01:13
यह सच है। मैंने वह जोड़ा है।
 – 
hek2mgl
21 सितंबर 2017, 01:18
क्या आप ओपी को स्पष्ट रूप से दिखाने के लिए इसे संपादित कर सकते हैं कि आपका पैटर्न क्यों काम करता है और वह जो अपेक्षा करता है उसे करने में विफल रहता है। यह आपके और मेरे लिए स्पष्ट हो सकता है कि आपका उत्तर उसकी समस्या का समाधान कैसे करता है, लेकिन आपने वास्तव में समस्या की ओर इशारा नहीं किया है।
 – 
Will Barnwell
21 सितंबर 2017, 02:08
मैंने वह जोड़ा है।
 – 
hek2mgl
21 सितंबर 2017, 02:22
1
धन्यवाद, अब मैं अच्छे विवेक के साथ आपको वह +1 दे सकता हूं जिसके आप हकदार हैं
 – 
Will Barnwell
21 सितंबर 2017, 02:50