एन माई पिछले लेख मैंने आपको एक बुनियादी स्तर पर बताया है कि नियमित अभिव्यक्ति के सबसे अधिक इस्तेमाल किए जाने वाले विशेष वर्ण कैसे काम करते हैं। इन नियमित अभिव्यक्तियों के साथ पाठ फ़ाइलों में या अन्य कमांड के आउटपुट में जटिल खोज करना संभव है। इस लेख में मैं यह समझाने जा रहा हूँ कि कैसे एक और दूसरे के लिए एक पाठ को बदलने की तुलना में बहुत अधिक शक्तिशाली तरीके से पाठ को खोजने और बदलने के लिए sed कमांड का उपयोग किया जाए।
Grep कमांड के बारे में थोड़ा और
इससे पहले कि मैं sed के बारे में बात करना शुरू करूँ, मैं पिछले लेख में जो कुछ समझाया गया था उसे पूरा करने के लिए grep कमांड के बारे में कुछ और टिप्पणी करना चाहूँगा। मैं जो कुछ भी कहने जा रहा हूं वह इस एक के लिए भी प्रासंगिक होगा। बाद में हम इस और खोज के बीच संबंध देखेंगे।
नियमित अभिव्यक्ति का मेल
पिछले लेख में मैंने जिन विशेष पात्रों के बारे में बात की है, उनमें से कई को अन्य पात्रों के साथ ही नहीं, बल्कि पूरे नियमित भावों के साथ जोड़ा जा सकता है। ऐसा करने का तरीका यह है कि कोष्ठक का उपयोग करने के लिए एक उपसक्रियता का निर्माण करें। आइए इसका एक उदाहरण देखें। आइए एक पाठ डाउनलोड करके शुरू करें जिसे हम परीक्षण के लिए उपयोग कर सकते हैं। यह वाक्यांशों की एक सूची है। उसके लिए हम निम्नलिखित कमांड का उपयोग करने जा रहे हैं:
curl http://artigoo.com/lista-de-frases-comparativas-comicas 2>/dev/null | sed -n 's/.*\(.*\.\)<\/p>/\1/gp' > frases
यह आपको उस निर्देशिका में छोड़ देगा जहां आप «वाक्यांश» नामक एक फ़ाइल लॉन्च करते हैं। आप इसे देखने के लिए खोल सकते हैं और थोड़ा हंस सकते हैं। 🙂
अब मान लेते हैं कि हम उन वाक्यांशों को खोजना चाहते हैं जिनमें ठीक 6 शब्द हैं। कठिनाई एक नियमित अभिव्यक्ति बनाने में है जो प्रत्येक शब्द से मेल खाती है। एक शब्द अक्षरों का एक क्रम है, या तो अपरकेस या लोअरकेस, जो कुछ इस तरह होगा '[a-zA-Z]+'
, लेकिन आपको यह भी बताना होगा कि इन अक्षरों को अक्षरों की तुलना में अन्य वर्णों से अलग करना होगा, अर्थात यह कुछ इस तरह होगा '[a-zA-Z]+[^a-zA-Z]+'
। याद रखें: कोष्ठक के अंदर पहले वर्ण के रूप में "^" इंगित करता है कि हम ऐसे वर्णों से मेल खाना चाहते हैं जो सीमा में नहीं हैं और "+" 1 या अधिक वर्णों को इंगित करता है।
हमारे पास पहले से ही एक नियमित अभिव्यक्ति है जो एक शब्द से मेल खा सकती है। इसे 6 के साथ बाँधने के लिए, इसे 6 बार दोहराना होगा। उसके लिए हमने चाबियों का इस्तेमाल किया, लेकिन इसे लगाना बेकार है '[a-zA-Z]+[^a-zA-Z]+{6}'
, क्योंकि 6 नियमित अभिव्यक्ति के अंतिम भाग को दोहराएगा और हम जो चाहते हैं, वह सब दोहराना है, इसलिए आपको जो करना है वह है: '([a-zA-Z]+[^a-zA-Z]+){6}'
। कोष्ठक के साथ हम एक उपपरिवर्तन बनाते हैं और ब्रेसिज़ के साथ हम इसे 6 बार दोहराते हैं। अब आपको बस पूरी लाइन से मिलान करने के लिए सामने एक "^" और पीछे एक "$" जोड़ना होगा। आदेश निम्नानुसार है:
grep -E '^([a-zA-Z]+[^a-zA-Z]+){6}$' frases
और परिणाम वही है जो हम चाहते थे:
यह मकारेना से अधिक गाया जाता है। आप लुइस एगुइले से अधिक संपन्न हैं। आपके पास पत्थर से कम संस्कृति है। आप कैनेटा ब्रावा से अधिक भाषाओं को जानते हैं। टुटन खामोन की तुलना में उनके पास अधिक झुर्रियाँ हैं। चाइल्डकैअर के बारे में आप रेम्बो से कम जानते हैं।
ध्यान दें कि हम ई पैरामीटर डालते हैं क्योंकि हम "+" कार्य करने के लिए विस्तारित नियमित अभिव्यक्तियों का उपयोग करना चाहते हैं। यदि हम मूल का उपयोग करते हैं, तो हमें कोष्ठक और ब्रेसिज़ से बचना होगा।
बैक रेफरेंस या बैकरेफरेंस
यदि आपके पास वर्तनी जाँचक स्थापित है, तो आपके पास शायद शब्दों की एक सूची होगी /usr/share/dict/words
। यदि नहीं, तो आप इसे आर्क में स्थापित कर सकते हैं:
sudo pacman -S words
या के साथ डेबियन में:
sudo aptitude install dictionaries-common
यदि आप चाहते हैं कि आप फ़ाइल पर एक नज़र डाल सकते हैं यह देखने के लिए कि उसके पास क्या शब्द हैं। दरअसल यह उस भाषा की शब्द फ़ाइल का लिंक है जिसमें आपका डिस्ट्रो है। आपके पास एक ही समय में कई वर्ड फाइल्स इंस्टॉल हो सकती हैं।
हम उस फ़ाइल का उपयोग करने जा रहे हैं। यह पता चला है कि हम सभी सात पत्र palindromes बाहर जानने के लिए बहुत उत्सुक हैं। उन लोगों के लिए जो नहीं जानते हैं: एक पैलिंड्रोम एक कैपिसुआ शब्द है, अर्थात इसे बाएं से दाएं और साथ ही दाएं से बाएं पढ़ा जा सकता है। चलिए निम्नलिखित कमांड आज़माते हैं:
grep '^\(.\)\(.\)\(.\).\3\2\1$' /usr/share/dict/words
यह थोड़ा अजीब लगता है, है ना? यदि हम इसका प्रयास करते हैं, तो परिणाम आपके डिस्ट्रो की भाषा और आपकी सूची में मौजूद शब्दों पर निर्भर करेगा, लेकिन मेरे मामले में, स्पैनिश भाषा के साथ, परिणाम यह है:
एनिलिन एनिलिन रोलिंग
आइए देखें कि यह नियमित अभिव्यक्ति कैसे काम करती है।
"^" और "$" के अलावा, जिसे हम पहले से ही जानते हैं कि यह किस लिए है, पहली चीज जो हम बाईं ओर देखते हैं, वह कोष्ठकों में संलग्न डॉट्स के तीन समूह हैं। प्रत्येक कोष्ठक के सामने सलाखों से भ्रमित मत हो। वे कोष्ठकों से बच रहे हैं क्योंकि हम बुनियादी नियमित अभिव्यक्तियों का उपयोग कर रहे हैं, लेकिन उनका कोई अन्य अर्थ नहीं है। महत्वपूर्ण बात यह है कि हम डॉट्स के साथ किसी भी तीन वर्णों के लिए पूछ रहे हैं, लेकिन उन डॉट्स में से प्रत्येक कोष्ठक में संलग्न है। यह उन बिंदुओं से मेल खाने वाले पात्रों को सहेजना है ताकि उन्हें नियमित अभिव्यक्ति से फिर से संदर्भित किया जा सके। यह कोष्ठकों का एक और उपयोग है जो बाद में प्रतिस्थापन बनाने में काम आएगा।
यह वह जगह है जहाँ नीचे तीन नंबर उनके सामने स्लैश के साथ आते हैं। इस मामले में, बार महत्वपूर्ण है। यह इंगित करने के लिए उपयोग किया जाता है कि नीचे दी गई संख्या एक पश्चगामी है और पिछले कोष्ठकों में से एक का उल्लेख कर रही है। उदाहरण के लिए: \ 1 पहले कोष्ठक को संदर्भित करता है, दूसरे को \ 2, और इसी तरह।
अर्थात्, हमने जो नियमित अभिव्यक्ति की है, जो हम खोज रहे हैं, वे सभी शब्द हैं जो किसी भी चार अक्षरों से शुरू होते हैं और फिर एक अक्षर होता है जो तीसरे के समान होता है, दूसरा जो दूसरे और दूसरे के समान होता है वह पहले जैसा है। परिणाम शब्द-सूची में शामिल सात-अक्षर का ताल है। जैसा हम चाहते थे वैसा ही हुआ।
यदि हम विस्तारित नियमित अभिव्यक्तियों का उपयोग कर रहे हैं, तो हमें कोष्ठकों से बचना नहीं होगा, लेकिन विस्तारित नियमित अभिव्यक्तियों के साथ वे सभी कार्यक्रमों में काम नहीं करते क्योंकि वे मानकीकृत नहीं हैं। हालांकि, grep के साथ वे काम करते हैं, इसलिए ऐसा करने का एक और तरीका हो सकता है। आप चाहें तो इसे आजमा सकते हैं।
रिप्लेसमेंट एक्सप्रेशन: सेड कमांड
खोज के अलावा, नियमित अभिव्यक्ति का सबसे अच्छा उपयोग जटिल ग्रंथों को बदलने के लिए है। ऐसा करने के लिए, यह करने का एक तरीका सेड कमांड के साथ है। सेड कमांड की शक्ति पाठ की जगह से बहुत आगे जाती है, लेकिन यहां मैं इसके लिए इसका उपयोग करने जा रहा हूं। इस कमांड के साथ मैं जिस वाक्य रचना का उपयोग करने जा रहा हूं वह निम्नलिखित है:
sed [-r] 's/REGEX/REPL/g' FICHERO
या यह भी:
COMANDO | sed [-r] 's/REGEX/REPL/g'
जहां REGEX सर्च रेगुलर एक्सप्रेशन होगा और रिप्लेसमेंट को रिप्लेस करेगा। ध्यान रखें कि यह कमांड वास्तव में उस फ़ाइल में कुछ भी प्रतिस्थापित नहीं करता है जिसे हम इंगित करते हैं, लेकिन यह जो करता है वह हमें टर्मिनल में प्रतिस्थापन का परिणाम दिखाता है, इसलिए उन कमांड्स से डरें नहीं जिन्हें मैं आगे रखने जा रहा हूं। उनमें से कोई भी आपके सिस्टम पर किसी भी फाइल को संशोधित करने वाला नहीं है।
एक सरल उदाहरण से शुरू करते हैं। हम सभी में / आदि निर्देशिका में विभिन्न विन्यास फाइलें होती हैं, जिनमें आमतौर पर "#" के साथ टिप्पणी होती है। मान लीजिए कि हम इन फ़ाइलों में से एक को बिना टिप्पणियों के देखना चाहते हैं। उदाहरण के लिए, मैं इसे fstab के साथ करने जा रहा हूं। आप जो चाहते हैं, उसके साथ कोशिश कर सकते हैं।
sed 's/#.*//g' /etc/fstab
मैं यहाँ कमांड का परिणाम नहीं डालने जा रहा हूँ क्योंकि यह इस बात पर निर्भर करता है कि आपके पास आपके fstab में क्या है, लेकिन यदि आप कमांड के आउटपुट की तुलना फाइल की सामग्री से करते हैं तो आप देखेंगे कि सभी टिप्पणियां गायब हो गई हैं।
इस कमांड में सर्च एक्सप्रेशन है «#.*
", यह एक" # "अक्षर है, जो किसी भी संख्या में वर्णों का अनुसरण करता है। और प्रतिस्थापन अभिव्यक्ति, यदि आप एक पंक्ति में दो पट्टियों को देखते हैं, तो आप देखेंगे कि कोई भी नहीं है, इसलिए यह क्या कर रहा है टिप्पणियों को कुछ नहीं के साथ बदल रहा है, अर्थात् उन्हें हटा रहा है। सरल असंभव।
अब हम इसके विपरीत करने जा रहे हैं। मान लीजिए कि हम जो चाहते हैं, वह फ़ाइल की सभी लाइनों पर टिप्पणी करना है। आइए इस तरह की कोशिश करें:
sed 's/^/# /g' /etc/fstab
आप देखेंगे कि, कमांड के आउटपुट में, सभी लाइनें एक हैश मार्क और एक खाली जगह से शुरू होती हैं। हमने जो किया है वह लाइन की शुरुआत को «से बदल देता है#
«। यह भी एक काफी सरल उदाहरण है जहां पाठ को प्रतिस्थापित किया जाना हमेशा समान होता है, लेकिन अब हम इसे थोड़ा और जटिल करने जा रहे हैं।
प्रतिस्थापन की कृपा यह है कि प्रतिस्थापन अभिव्यक्ति में आप पहले की तरह बैकरेफर का उपयोग कर सकते हैं जो मैंने आपको बताया था। हम उस वाक्यांश फ़ाइल पर वापस जाते हैं जिसे हमने लेख की शुरुआत में डाउनलोड किया था। हम सभी बड़े अक्षरों में कोष्ठक में रखने जा रहे हैं जो हैं, लेकिन हम इसे एक कमांड के साथ करेंगे:
sed 's/\([A-Z]\)/(\1)/g' frases
हमारे यहां जो कुछ भी है वह प्रतिस्थापन अभिव्यक्ति में एक बैकरेन्स है जो खोज अभिव्यक्ति में कोष्ठकों को संदर्भित करता है। प्रतिस्थापन अभिव्यक्ति में कोष्ठक सामान्य कोष्ठक हैं। प्रतिस्थापन अभिव्यक्ति में उनके पास कोई विशेष अर्थ नहीं है, उन्हें वैसे ही रखा जाता है। इसका परिणाम यह होता है कि सभी बड़े अक्षरों को उसी अक्षर से बदल दिया जाता है, चाहे वह कुछ भी हो, उसके चारों ओर कोष्ठक होते हैं।
एक और चरित्र है जिसे प्रतिस्थापन अभिव्यक्ति में भी इस्तेमाल किया जा सकता है, यह "और" है और इसे खोज अभिव्यक्ति द्वारा मिलान किए गए सभी पाठ द्वारा प्रतिस्थापित किया जाता है। इसका एक उदाहरण फ़ाइल के सभी वाक्यांशों को उद्धरणों में रख सकता है। इस आदेश के साथ इसे प्राप्त किया जा सकता है:
sed 's/.*/"&"/g' frases
इस कमांड का संचालन पिछले एक के समान है, केवल अब जो हम प्रतिस्थापित करते हैं वह पूरी पंक्ति है जिसके चारों ओर एक ही लाइन है। चूंकि हम "और" का उपयोग कर रहे हैं, इसलिए कोष्ठक लगाना आवश्यक नहीं है।
कुछ उपयोगी आदेश नियमित अभिव्यक्ति के साथ
यहां कुछ आदेश दिए गए हैं जो मुझे उपयोगी या उत्सुक लगते हैं और जो नियमित अभिव्यक्ति का उपयोग करते हैं। इन आदेशों के साथ नियमित अभिव्यक्तियों की उपयोगिता उन उदाहरणों की तुलना में बहुत बेहतर है, जो मैंने अभी तक दिए हैं, लेकिन मुझे इस बारे में कुछ समझाना महत्वपूर्ण था कि उन्हें समझने के लिए नियमित अभिव्यक्ति कैसे काम करती है।
- एक आदमी पृष्ठ के अनुभाग दिखाएं:
man bash | grep '^[A-Z][A-Z ]*$'
बेशक, आप जो कुछ भी चाहते हैं, उसे bash कमांड बदल सकते हैं। और फिर आदमी से, आप सीधे उस अनुभाग पर जा सकते हैं जो आपकी रुचि का उपयोग कर रहा है, ज़ाहिर है, एक नियमित अभिव्यक्ति। खोज शुरू करने और लिखने के लिए «/» दबाएँ^ALIASES$
उदाहरण के लिए, ALIASES अनुभाग पर जाएं। मुझे लगता है कि यह पहला प्रयोग है जो मैंने कुछ साल पहले नियमित अभिव्यक्ति के लिए शुरू किया था। मैनुअल के कुछ पन्नों के माध्यम से चलना इस तरह की चाल के बिना लगभग असंभव है।
- विशेष सहित मशीन के सभी उपयोगकर्ताओं के नाम दिखाएँ:
sed 's/\([^:]*\).*/\1/' /etc/passwd
- उपयोगकर्ता नाम दिखाएं, लेकिन केवल शेल वाले:
grep -vE '(/false|/nologin)$' /etc/passwd | sed 's/\([^:]*\).*/\1/g'
यह वास्तव में एक एकल नियमित अभिव्यक्ति के साथ किया जा सकता है, लेकिन इसे करने का तरीका इन लेखों में जो मैंने आपको बताया है, उससे आगे निकल जाता है, इसलिए मैंने इसे दो आदेशों को मिलाकर किया है।
- संख्या फ़ाइल में सभी संख्याओं के अंतिम तीन अंकों से पहले अल्पविराम डालें:
sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers
यह केवल 6 अंकों तक की संख्या के साथ काम करता है, लेकिन इसे तीन अंकों के अन्य समूहों में विभाजक लगाने के लिए एक से अधिक बार कहा जा सकता है।
- एक फ़ाइल से सभी ईमेल पते निकालें:
grep -E '\<[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\>' FICHERO
- एक फ़ाइल में दिखाई देने वाली सभी तिथियों के दिन, महीने और वर्ष को अलग करें:
sed -r 's/([0-9]{2})[/-]([0-9]{2})[/-]([0-9]{4})/Día: \1, Mes: \2, Año: \3/g' FICHERO
- हमारे स्थानीय आईपी का पता लगाएं:
/sbin/ifconfig | grep 'inet .*broadcast' | sed -r 's/[^0-9]*(([0-9]+\.){3}[0-9]+).*/\1/g'
यह एक सिंगल सेड कमांड के साथ भी किया जा सकता है, लेकिन मैं इसे बेहतर तरीके से ग्रीप और सादगी के लिए अलग करता हूं।
कुछ उपयोगी पते
यहां कुछ पते दिए गए हैं जो नियमित अभिव्यक्ति से संबंधित उपयोगी हो सकते हैं:
- नियमित अभिव्यक्ति पुस्तकालय: यह एक नियमित अभिव्यक्ति पुस्तकालय है जिसमें आप उस विषय से संबंधित नियमित अभिव्यक्ति खोज सकते हैं जिसमें आपकी रुचि हो। वेब पते, आईडी या जो कुछ भी खोज करना है।
- RegExr: एक ऑनलाइन नियमित अभिव्यक्ति चेकर। यह आपको एक पाठ दर्ज करने और इसे एक नियमित अभिव्यक्ति लागू करने की अनुमति देता है या तो खोज या प्रतिस्थापित कर सकता है। यह नियमित अभिव्यक्ति के बारे में जानकारी देता है और आपके पास इसके व्यवहार को बदलने के लिए कुछ विकल्प हैं।
- नियमित अभिव्यक्ति परीक्षक: यह फ़ायरफ़ॉक्स के लिए एक ऐडऑन है जो आपको ब्राउज़र से नियमित अभिव्यक्ति की जांच करने की अनुमति देता है।
निष्कर्ष
अभी के लिए बस इतना ही। नियमित अभिव्यक्ति जटिल लेकिन उपयोगी हैं। उन्हें सीखने में समय लगता है, लेकिन अगर आप मेरे जैसे हैं, तो उनके साथ खेलना मजेदार और कम लगेगा, आप उन्हें बहुत कम करेंगे। यह पूरी दुनिया है। आलसी क्वांटिफायर, पेरल-स्टाइल रेगेक्स, मल्टीलाइन आदि के बारे में अभी तक बहुत कुछ कहा जा सकता है। और फिर प्रत्येक कार्यक्रम की अपनी विशेषताएं और इसके प्रकार हैं, इसलिए मैं आपको जो सबसे अच्छी सलाह दे सकता हूं वह यह है कि आप हमेशा उस कार्यक्रम के प्रलेखन को देखें जो आप हर बार उपयोग कर रहे हैं एक नए कार्यक्रम में एक नियमित अभिव्यक्ति लिखना है।
अरे! … अरे! … उठो! ... तुम सब क्या कर रहे हो? 🙂
सूत्रों का कहना है
इस लेख में नियमित अभिव्यक्ति के लिए कुछ विचार और उदाहरण मैं यहाँ से ले रहा हूँ:
- http://sed.sourceforge.net/sed1line.txt
- http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substitution-examples/
मास्टरली !!!
यह इतना बुरा नहीं है, लेकिन बहुत-बहुत धन्यवाद। उम्मीद है लोग इसे पसंद करेंगे। 🙂
मुझे यह पसंद है हा!
तब मैंने कुछ सही किया होगा। जबरदस्त हंसी!! 🙂
आपकी टिप्पणी के लिए बहुत बहुत धन्यवाद।
भाड़ में जाओ आदमी लिखते रहो, इसे बनाए रखो।
@ ब्लेयर पास्कल: आपकी जैसी टिप्पणियां इसे प्रोत्साहित करती हैं। Much बहुत बहुत धन्यवाद !!
मुझे भी यह पसंद आया ... धन्यवाद thanks
टिप्पणी के लिए धन्यवाद। मुझे कुछ और लिखने की उम्मीद है। 🙂
आपकी पोस्ट शानदार हैं, आप बहुत कुछ सीखते हैं, बल्कि, आप एक सुंदर और कुशल तरीके से कार्य करना सीखते हैं।
क्या आपने अपने सभी शेल स्क्रिप्ट पोस्ट को इकट्ठा करने के बारे में सोचा है? एक पीडीएफ में क्रमबद्ध एक महान मैनुअल बनाना होगा।
खुश हो जाओ और बहुत बहुत धन्यवाद!
बहुत बहुत धन्यवाद!! यह बुरा विचार नहीं है। फिलहाल केवल दो हैं, लेकिन मैं इसके बारे में बाद में सोचूंगा। 🙂
बहुत अच्छा लेख, 5+।
धन्यवाद। मैं खुश हूँ कि आपको यह पसंद है। 🙂
अति उत्कृष्ट! मुझे निम्नलिखित अभिव्यक्ति को बदलने की आवश्यकता है और मुझे नहीं पता कि यह कैसे करना है:
192.168.0.138/ 192.168.0.111/data द्वारा जारी करें
समस्या "/" प्रतीक में है।
मैं कमांड का उपयोग कर रहा हूं:
खोजो। -name "* .txt" -exec sed -i 's / TEXT1 / TEXT2 / g' {} \;
इस प्रकार के कार्य को रिमझिम तरीके से करने के लिए उपयोग किया जाता है, लेकिन मैं नहीं कर सकता ...
क्या किसी को पता है कि मुझे यह कैसे करना चाहिए?
गले!
सबा
आपको इस तरह से चरित्र से बचना होगा:
खोजो। -name "* .txt" -exec sed -i 's / \ / Server / \ / data / g' {} \;
आप सेड में एक और विभाजक का उपयोग भी कर सकते हैं। यह एक बार होने की जरूरत नहीं है। सेड किसी भी वर्ण का उपयोग करने की अनुमति देता है। उदाहरण के लिए, यह स्पष्ट होगा:
खोजो। -name "* .txt" -exec sed -i s। / / Server | / data | g '{} \;
और अगर आप इस टिप्पणी से कमांड कॉपी और पेस्ट करने जा रहे हैं, तो उद्धरण चिह्नों से सावधान रहें, यह शब्द टाइपोग्राफिक वालों के लिए उन्हें बदल देता है। 🙂
नमस्ते.
बहुत बढ़िया!
मैं लंबे समय से इस समाधान की तलाश कर रहा हूं।
यहां मैंने पूरी कमांड को छोड़ दिया है जिसका मैंने उपयोग किया है
खोजो। -name "* .txt" -exec sed -i 's | 192 \ _168 \ _ \ _ .0 \ _ \ / सर्वर | 238 \ _192 \ _ \ _ .168 \ / डेटा | जी' {} \ _।
इस आदेश का लाभ यह है कि यह सभी .txt फ़ाइलों (या इच्छित एक्सटेंशन) को पुनरावर्ती रूप से बदलता है ... आपको बहुत सावधान रहना होगा!
लेकिन यह बहुत उपयोगी है !!!
खैर, सब कुछ के लिए धन्यवाद और पूरे समूह को एक हजार बधाई।
मैं हमेशा उन्हें मेल से पढ़ता हूँ!
Hugs
सबा