रेगेक्स: एक अन्य वर्ण की समान संख्या के साथ व्हॉट्सएप की महत्वाकांक्षी संख्या को बदलें


0

मैं जो करने की कोशिश कर रहा हूं, वह एक सूची है जो बहुत सी सामग्री की तरह स्वरूपित है और डॉट्स के साथ बाएं और दाएं ग्रंथों के बीच व्हाट्सएप (एकल अंतरिक्ष वर्ण, टैब नहीं) को प्रतिस्थापित करता है, केवल दो सबसे बाहरी व्हाट्सएप पात्रों को संरक्षित करता है।

तो विशेष रूप से, मैं इस तरह की एक सूची लेना चाहता हूं:

foo        url1
foobar     url2
foo bar    url3

और इसे इस में बदलें:

foo ...... url1
foobar ... url2
foo bar .. url3

मैं अपने पाठ के संपादन के लिए ग्रहण आईडीई का उपयोग कर रहा हूं। मैं विभिन्न रेगेक्स इंजनों से परिचित नहीं हूं, लेकिन मैं अनुमान लगा रहा हूं कि यह जकार्ता रेगेक्सपी या जावा.यूटिल.रेजेक्स (जो मैंने विकिपीडिया पर देखा था) का उपयोग करता है।

मैं " " का उपयोग करके फाइंड फ़ील्ड में व्हॉट्सएप वर्णों को कैप्चर कर सकता हूं ( +), लेकिन मुझे नहीं पता कि उन्हें फ़ील्ड के साथ प्रतिस्थापन में समान संख्या में डॉट्स में कैसे परिवर्तित किया जाए ।

मैंने कुछ Googling किया और इस सवाल पर आया (जो कि मैंने " ( +)" सिंटैक्स) सीखा है । ऐसा लगता है कि यह वही हो सकता है, या मेरा एक समान प्रश्न हो सकता है। लेकिन मुझे या तो मेरा उत्तर नहीं मिला या मैंने दिए गए उत्तरों को नहीं समझा।


कोई सफ़ेद स्पेस या सिर्फ स्पेस? आपकी अभिव्यक्ति केवल रिक्त स्थान के बारे में प्रतीत होती है। तो फिर आपको जो भी किरदार पसंद है उसके साथ सिर्फ स्पेस की जगह क्यों नहीं?
चिपचिपा सा

क्योंकि वे शीर्षक में रिक्त स्थान नहीं बदलना चाहते हैं; उदाहरण के लिए, "फू बार" → "foo.bar"। इसके अलावा, वे "फू यूआरएल" को "फू ........ यूआरएल" में बदलना नहीं चाहते हैं; वे "foo␣ ...... lurl" (पहला और अंतिम स्थान रखते हुए) चाहते हैं।
स्कॉट

@ सही करे
एंटुमडेल्यूज

यह एक प्रश्न जैसा लगता है जो पहले आया है, और इसलिए संभवतः यह पहले से ही यहां या यूनिक्स और लिनक्स स्टैक एक्सचेंज पर उत्तर दिया गया है । लेकिन मुझे अभी इसका उत्तर याद नहीं है। मैं बाद में यह करने की कोशिश करूंगा जब मेरे पास अधिक समय होगा, लेकिन, तब तक, मैं आपको हमारी साइट को थोड़ा कठिन खोजने का सुझाव देता हूं। संकेत: स्टैक एक्सचेंज का अपना स्वयं का खोज इंजन है, लेकिन कभी-कभी आपको Google और कह site:superuser.com या  का उपयोग करके बेहतर परिणाम मिलते हैं  site:unix.stackexchange.com
स्कॉट

मैं एक संक्षिप्त खोज (लगभग 15 मिनट) किया था और मैं किसी भी सटीक मेल नहीं मिला है, हालांकि एसईडी का प्रयोग प्रतिस्थापन तार का मिलान संख्या के साथ शुरुआत में सभी घटनाओं को बदलने के लिए और मिलान किया लाइन में पात्रों की जगह करीब हैं। चूंकि किसी ने आपके प्रश्न को एक डुप्लिकेट के रूप में चिह्नित नहीं किया है, और आपने अब तक केवल एक ही उत्तर प्राप्त किया है, मैंने स्वयं तीन उत्तरों का आविष्कार किया है (पहले एक मेरे द्वारा जुड़े प्रश्नों में से एक के समान है)। मुझे आशा है कि आपके पास पहुंच होगी sed
स्कॉट

जवाबों:


1

आप नोटपैड ++ के साथ ऐसा कर सकते हैं

  • Ctrl+H
  • क्या ढूँडो: (?<!\S) (?= )
  • से बदलो: .
  • चारों ओर लपेटें की जाँच करें
  • नियमित अभिव्यक्ति की जाँच करें
  • Replace all

स्पष्टीकरण:

(?<!    : Start negative lookbehind, make sure we have not
  \S    : a non-space character
)       : end lookbehind
        : a space
(?=     : start lookahead, make sure we have
        : a space
)       : en lookahead

रिप्लेसमेंट:

.       : a dot

दिए गए उदाहरण के लिए परिणाम:

foo ...... url1
foobar ... url2
foo bar .. url3

दिलचस्प लग रहा है। मेरे पास नोटपैड ++ नहीं है, इसलिए मैं इसका परीक्षण नहीं कर सकता। क्या आप बता सकते हैं कि यह शीर्षक के बाद पहला स्थान क्यों नहीं बदलता है, जिसके परिणामस्वरूप foo.......␣url1?
स्कॉट

@ कोट: मुझे पूरा यकीन है कि यह सबलाइमटेक्स्ट के साथ भी काम करता है। एक स्थान को केवल तब प्रतिस्थापित किया जाता है जब उसके पहले एक गैर-स्थान न हो और उसके बाद का स्थान।
टोटो

ओह ... जब एक जगह के बाद है, और  पहले एक गैर अंतरिक्ष नहीं है । मुझे डबल नेगेटिव याद आ गया। क्या आप एक गैर-अंतरिक्ष के लिए एक नकारात्मक खोज के बजाय एक अंतरिक्ष के लिए नियमित रूप से खोज नहीं कर सकते?
स्कॉट

@ स्थिति: नहीं, अगर मैं सकारात्मक खोज (यानी। (?<=\s)) का उपयोग करता हूं, तो अनिवार्य होने से पहले, एक (?<!\S) कंट्रोइरो स्पेस को विकल्प बनाता है और ऐसा तब होता है जब पहले स्थान को डॉट द्वारा बदल दिया गया हो।
टोटो

खैर, मुझे अभी भी समझ में नहीं आया है। :-( ⁠
स्कॉट

0

यह प्रश्न स्पष्ट रूप से बताता है कि शीर्षक में रिक्त स्थान होंगे। सुरक्षा के लिए, मैं मान रहा हूं कि शीर्षक में डॉट्स (अवधि) हो सकते हैं; उदाहरण के लिए, "3.14159 का इतिहास" या "डॉ। डुलिटस डिस्कवरी ”। मेरे उत्तर मान लेते हैं कि कुछ ऐसा चरित्र है जो कभी भी सामग्री की तालिका में प्रकट नहीं होगा; विशेष रूप से, वे मानते हैं कि यह है @। यदि आपके पास @अपनी तालिका में, (जैसे कुछ चरित्र है कि कभी नहीं दिखाई देता है साथ बदलें #, ^, _, |, आदि)। यदि आप वास्तव में प्रत्येक ASCII वर्ण का उपयोग करते हैं, तो आपको वर्ण अनुक्रम का उपयोग करने की आवश्यकता हो सकती है, जैसे <@>

इसके साथ करने के तीन तरीके sed:

लूप:

sed 's/\(.*\)\( \)/\1@\2/; :loop; s/  @/ @./; t loop; s/@//'
  • s/\(.*\)\( \)/\1@\2/लाइन पर अंतिम स्थान पाता है और @इससे पहले एक आवेषण करता है ।
  • :loop एक मील मार्कर की तरह एक लेबल है।
  • s/ @/ @./(यह s/␣␣@/␣@./, गैर-अस्पष्टता के लिए) कहता है, यदि इससे पहले दो स्थान हैं, तो @उन्हें ␣.(स्थान और डॉट) से बदलें , और @उनके बीच स्थानांतरित करें।
  • t loopकहते हैं, यदि उपरोक्त प्रतिस्थापन सफल हुआ, तो :loopमार्कर पर वापस जाएं और दोहराएं। अन्यथा, जारी रखें
  • s/@//, जो निकालता है @

तो foo barआपके टेबल की लाइन इस प्रकार प्रोसेस की जाएगी:

प्रारंभिक मूल्य: फू बार url3
s / \ ((। * \) \ (\) / \ 1 @ \ 2 / फू बार @ url3
s / @ / @ /। / फू बार @। URL3
s / @ / @ /। / फू बार @ .. url3
s / @ / @ /। / फू बार @ .. url3         (प्रतिस्थापन विफल रहता है, इसलिए लूप न करें)
s / @ // फू बार .. url3
अंतिम उत्पादन: फू बार .. url3

भारी संख्या:

sed 's/\(.*\)\( \)/\1@@@@@@@@@@@@@@@@@@@@\2/; s/ [ @]\{20\}/ /; s/@/./g'
  • s/\(.*\)\( \)/\1@@@@@@@@@@@@@@@@@@@@\2/sपहले समाधान में पहले उपकमांड के समान है ; यह लाइन पर अंतिम स्थान पाता है और @इससे पहले 20 वर्णों की एक स्ट्रिंग सम्मिलित करता  है। यह वास्तव में एक ऐसी संख्या होनी चाहिए जो कम से कम उतनी बड़ी हो जितनी अधिकतम डॉट्स आपको कभी भी एक पंक्ति में सम्मिलित करने की आवश्यकता होगी; उदाहरण के लिए, 80. 80 @वर्णों की एक स्ट्रिंग का प्रबंधन  अजीब होगा; आप इसके साथ प्रतिस्थापित करना चाह सकते हैं
    • s/\(.*\)\( \)/\1<@><@><@><@><@>\2/; s/<@>/@@@@@@@@/g जो पाँच <@>अनुक्रमों की एक स्ट्रिंग सम्मिलित करता है , और फिर उनमें से प्रत्येक को 16 @वर्णों की एक स्ट्रिंग के साथ बदल देता है  , जिसके परिणामस्वरूप 5 × 16/80  @वर्ण होते हैं।
  • s/ [ @]\{20\}/ /20 लगातार वर्णों की एक स्ट्रिंग पाता है जो या तो एक स्थान या एक है @, जो एक स्थान से पहले है, और इसे केवल पूर्ववर्ती स्थान के साथ बदल देता है। 20पिछले चरण से संख्या के साथ बदलें ।
  • s/@/./gप्रत्येक @को एक बिंदी के साथ बदल देता है ।

तो fooआपके टेबल की लाइन इस प्रकार प्रोसेस की जाएगी:

Initial value:                  foo        url1
s/\(.*\)\( \)/\1@@@@...@@@@\2/  foo       @@@@@@@@@@@@@@@@@@@@ url1
s/ [ @]\{20\}/ /                   _[↑↑↑↑↑↑remove↑↑↑↑↑↑]
                                foo @@@@@@ url1
s/@/./g                         foo ...... url1

"होल्ड स्पेस" का उपयोग करें:

sed 's/.*[^ ] /&@/; h; s/ /./g; s/\(\.*\)\./\1 /; x; G; s/@.*@//'
  • s/.*[^ ] /&@/है समान पिछले आदेशों के लिए; यह शीर्षक के अंत का पता लगाता है - सटीक होने के लिए, अंतिम स्थान जहां एक गैर-रिक्त चरित्र के बाद एक स्थान है - और @इसके बाद आवेषण ।
  • h होल्ड स्पेस पर लाइन कॉपी करता है।
  • s/ /./g सभी स्थानों को डॉट्स के साथ पंक्ति में बदल देता है।
  • s/\(\.*\)\./\1 /एक स्थान के साथ अंतिम बिंदु को बदलता है। (इसे बदलने की आवश्यकता होगी यदि URL में डॉट्स हो सकते हैं, जो मुझे लगता है कि संभावना है।)
  • x पैटर्न स्पेस और होल्ड स्पेस का आदान-प्रदान करता है।
  • Gहोल्ड स्पेस को पैटर्न स्पेस में जोड़ता है। अब हमारे पास अनिवार्य रूप से पंक्ति की दो प्रतियां हैं।
  • s/@.*@// पहली प्रति का पहला भाग और दूसरी प्रति का दूसरा भाग रखता है, बीच में सामान से छुटकारा।
Initial value: foo bar    url3

                      Pattern space                            Hold space
s/.*[^ ] /&@/       foo bar @   url3
h                   foo bar @   url3                        foo bar @   url3
s/ /./g             foo.bar.@...url3                        foo bar @   url3
s/\(\.*\)\./\1 /    foo.bar.@.. url3                        foo bar @   url3
x                   foo bar @   url3                        foo.bar.@.. url3
G                   foo bar @   url3 foo.bar.@.. url3       foo.bar.@.. url3
s/@.*@//            foo bar .. url3                         foo.bar.@.. url3

Final output:   foo bar .. url3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.