एक अनुगामी व्हाट्सएप के साथ एक शब्द के मेल से क्या फर्क पड़ता है?


12

मैं शेल-स्क्रिप्टिंग सीख रहा हूं और इसके लिए मैं HackerRank का उपयोग कर रहा हूं। एक sedही साइट पर संबंधित प्रश्न है : 'Sed' कमांड # 1 :

दी गई इनपुट फ़ाइल में प्रत्येक पंक्ति के लिए, 'the' के साथ 'the' शब्द की पहली घटना को रूपांतरित करें। खोज और परिवर्तन सख्ती से संवेदनशील होना चाहिए।

सबसे पहले मैंने कोशिश की,

sed 's/the/this/'

लेकिन उस नमूना परीक्षण मामले में विफल रहा। फिर मैंने कोशिश की

sed 's/the /this /'

और यह काम किया। तो, सवाल उठता है कि व्हाट्सएप ने क्या अंतर पैदा किया? क्या मुझसे कोई चूक हो रही है?


मैं पहले संस्करण को "काम" भी मानता हूं, लेकिन जैसा कि आपने अपेक्षा की थी। इसे अक्षर अनुक्रम "" की पहली घटना को प्रतिस्थापित करना चाहिए था, लेकिन आपने संभवतः "द" शब्द की पहली घटना को देखा।
डब्यू

खैर, इस अभ्यास में, हाँ, व्यवहार में, नहीं।
रॉल्फ

जवाबों:


7

अंतर यह है कि theइनपुट टेक्स्ट में कोई स्पेस है या नहीं ।
उदाहरण के लिए:

एक स्थान के बिना एक वाक्य के साथ , कोई प्रतिस्थापन नहीं:

$ echo 'theman' | sed 's/the /this /'
theman

एक स्थान के साथ एक वाक्य के साथ , उम्मीद के मुताबिक काम करता है:

$ echo 'the man' | sed 's/the /this /'
this man

एक और व्हाट्सएप चरित्र के साथ एक वाक्य के साथ , कोई प्रतिस्थापन नहीं होगा:

$ echo -e 'the\tman' | sed 's/the /this /'
the     man

मैंने यह खो दिया। मुझे एक स्ट्रिंग के रूप में "" लेना था। विकल्प नहीं है।
JHA

1
@ झा: यह एक पंक्ति के अंत में भी मायने रखता है। उदाहरण के लिए "शब्द" एक पंक्ति के अंत में एक फाइल के भाग के रूप में दिखाई दे सकता है जिसमें लाइन रैपिंग होती है, लेकिन फिर भी एक पैराग्राफ के बीच में होता है और इस प्रकार अंग्रेजी वाक्य में एक सामान्य शब्द होता है। the( |$)अगर वह विस्तारित रेगेक्स काम करता है, तो काम करने के करीब हो सकता है। वैसे भी, IDK जिसका अर्थ है "स्ट्रिंग के रूप में" बनाम सबस्ट्रिंग। दोनों मामलों में यह पूरी लाइन का एक विकल्प है, और आपके टेस्टकेस उन मामलों का पता लगाने के लिए अपर्याप्त हैं जहां "the "विफल रहता है। कुसलानाडा का जवाब काफी बेहतर है, मैं इसे स्वीकार करने की सलाह दूंगा।
पीटर कॉर्डेस

20

यह शब्द मिलान करने का एक सस्ता और त्रुटिपूर्ण तरीका है ।

ध्यान दें कि theएक स्थान के साथ यह शब्द से मेल नहीं खाता है thereby, इसलिए theशब्दों की शुरुआत में उस स्ट्रिंग से मेल खाने से बचने के बाद एक स्थान के साथ मिलान करना । हालाँकि, यह अभी भी मेल खाता है bathe(यदि किसी स्थान के बाद), और यह एक पंक्ति के अंत में मेल नहीं खाता है the

शब्द को theठीक से (या किसी भी अन्य शब्द) से मेल करने के लिए , आपको शब्द के चारों ओर रिक्त स्थान का उपयोग नहीं करना चाहिए, क्योंकि यह आपको लाइनों के प्रारंभ या अंत में मिलान करने से रोकेगा या यदि यह किसी अन्य गैर-शब्द चरित्र द्वारा फ़्लैंक किया गया है, जैसे कि उदाहरण के लिए कोई विराम चिह्न या टैब वर्ण।

इसके बजाय, एक शून्य-चौड़ाई शब्द सीमा पैटर्न का उपयोग करें:

sed 's/\<the\>/this/'

\<और \>यानी एक के बीच की जगह से पहले और शब्द के बाद सीमाओं से मेल खाता है, शब्द चरित्र और एक गैर शब्द चरित्र । एक शब्द चरित्र आम तौर पर किसी भी चरित्र से मेल खाता है [[:alnum:]_](या [A-Za-z0-9_]POSIX लोकेल में)।

जीएनयू के साथ sed, आप भी इस्तेमाल कर सकते हैं \bके स्थान पर \<और \>:

sed 's/\bthe\b/this/'

7

sed नियमित भाव से काम करता है। sed 's/the /this /'आप का उपयोग सिर्फ theमिलान पैटर्न के हिस्से के बाद जगह बनाते हैं ।

का उपयोग करते हुए sed 's/the/this/'आप की सभी घटनाओं की जगह theके साथ thisकरता है, तो एक अंतरिक्ष के बाद से मौजूद है कोई फर्क नहीं पड़ता the

HackerRank अभ्यास में, परिणाम समान है क्योंकि इसे बदलने के लिए तार्किक है ... आप केवल एक प्रो-संज्ञा की जगह लेते हैं जो डिफ़ॉल्ट रूप से अंतरिक्ष (व्याकरण के नियमों) द्वारा पीछा किया जाता है।

यदि आप उदाहरण के लिए theशब्द में पूंजीकरण करने का प्रयास करते हैं, तो आप अंतर देख सकते हैं the theater:

echo 'the theater' |sed 's/the /THE /g'
THE theater                              
#theater is ignored since the is not followed by space

echo 'the theater' |sed 's/the/THE/g'
THE THEater
#both the are capitalized.

जवाब के लिए धन्यवाद। सराहा गया :)
JHA

"आप सभी घटनाओं को प्रतिस्थापित करते हैं" स्पष्ट होने के लिए: gप्रतिस्थापन पाठ के बाद, आप केवल पहली घटना को प्रतिस्थापित करते हैं।
डब्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.