नियमित अभिव्यक्तियों का उपयोग करके खोजें और बदलें


26

मेरे पास उपयोगकर्ता डिफॉल्ट के एक समूह के साथ एक फ़ाइल है। मैं कुछ पाठ को बदलना चाहता हूं, लेकिन मैं एक मिलानकर्ता और प्रतिकृति के साथ आने में संघर्ष कर रहा हूं। निम्नलिखित उदाहरण का उपयोग करना:

###############################################################################
# Trackpad, mouse, keyboard, Bluetooth accessories, and input                 #
###############################################################################

# Trackpad: enable tap to click for this user and for the login screen
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true

मैं के # Trackpad: ...साथ बदलना चाहते हैंrunning "Trackpad: ..."

समस्या को तोड़ते हुए, मैं एक regex परीक्षक का उपयोग करके कुछ लेकर आया:

/\n\n#\s(.*)/g

अगर मैं कोशिश करता हूं और विम में इसका उपयोग करता हूं तो यह मेरे लिए काम नहीं करता है:

:/\n\n#\s(.*)/running "\1"/g

मुझे लगता है कि मेरी समस्या दो विशिष्ट प्रश्नों से उबल रही है:

  1. मैं \nपात्रों की खोज करने से कैसे बच सकता हूं , और इसके बजाय यह सुनिश्चित करें #कि खोज समूह के अंत में दिखाई न दे?
  2. मैं प्रभावी रूप से कैप्चर समूहों का उपयोग कैसे कर सकता हूं?

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

जवाबों:


18

बस स्पष्ट होने के लिए ... मेरा मानना ​​है कि आपने इसके लिए प्रतिस्थापन का परिणाम पूछा?

###############################################################################
# Trackpad, mouse, keyboard, Bluetooth accessories, and input                 #
###############################################################################

running "Trackpad: enable tap to click for this user and for the login screen"
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true

उस स्थिति में, मैं निम्नलिखित आदेश सुझाता हूं:

:%s/\n\n#\s\+\(.*\)/^M^Mrunning "\1"/

पैटर्न की व्याख्या

:s/PATTERN/REPLACEMENT/है स्थानापन्न आदेश। प्रतिशत :%sकेवल वर्तमान लाइन के बजाय पूरी फ़ाइल पर काम करता है।

\n\nका कहना है कि ब्याज की लाइन एक रिक्त पंक्ति के बाद होने चाहिए। यदि आपने पूर्ववर्ती रिक्त रेखा की परवाह नहीं की है, तो ^पर्याप्त होगा।

#\s\+एक या अधिक व्हाट्सएप पात्रों के बाद एक हैश चरित्र से मेल खाता है। \(.*\)लाइन पर सभी बाद के पाठ को कैप्चर करता है।

प्रतिस्थापन पाठ की व्याख्या

^M^M\n\nपैटर्न में मौजूद थे कि प्रतिस्थापित करने के लिए लाइनों के दो छोर सम्मिलित करता है । अन्यथा, पाठ रिक्त पंक्ति से पहले पंक्ति के अंत में स्थानांतरित हो जाएगा। प्रत्येक को टाइप करने के लिए ^M, दबाएँ Ctrl-V Ctrl-M

फिर, स्ट्रिंग को सम्मिलित करें running, उसके बाद कोष्ठकों में जो कुछ भी पकड़ा गया था, दोहरे-उद्धरणों के भीतर।


मैं आपके उत्तर को संपादित करने में असमर्थ हूं, लेकिन मेरा मानना ​​है कि आपने इसका मतलब :%s/\v\n\n#\s+(.*)/^M^Mrunning "\1"/("जादू" ध्वज जोड़ा है)। मेरे मूल प्रश्न का सही उत्तर चुनना वास्तव में कठिन है, लेकिन मुझे लगता है कि यह उत्तर मेरे मूल अपेक्षित उत्तर के सबसे निकट है। यह भी केवल एक ही है जो किसी सीमा का चयन करने की आवश्यकता के बिना पूरी फ़ाइल में काम करता है।
चौकोरफ्रॉग

1
IIRC आप नई लाइनें प्राप्त करने के \rबजाय उपयोग कर सकते हैं ^M?
मूरू

11

मैं कुछ इस तरह का उपयोग करेंगे:

:s/^#\s\+\(.\{-}\):/running "\1":/
  • ^##लाइन की शुरुआत में एंकर से मेल खाने के लिए (यह सवाल 1 जवाब देता है)
  • \s\+ किसी भी व्हाट्सएप का एक या अधिक बार मिलान करना
  • \( एक समूह शुरू करने के लिए (यह सवाल 2 का जवाब देता है)
  • .\{-}\किसी भी चरित्र को गैर-लालची तरीके से 0 या अधिक बार मिलान करने के लिए ; यह इस बात से अलग .*है कि यह जितना संभव हो उतना कम मेल खाने की कोशिश करता है, और जितना संभव हो उतना कम नहीं है। :यह क्यों मायने रखता है यह देखने के लिए टिप्पणी में एक चरित्र जोड़ने का प्रयास करें
  • \) उपसमूह समाप्त करने के लिए।
  • : एक शाब्दिक से मेल खाता है :

इसके बाद हम आपके इच्छित पाठ से इसे प्रतिस्थापित करते हैं, और \1हमारे द्वारा कैप्चर किए गए समूह को संदर्भित करने के लिए उपयोग करते हैं।

मैं एक regex परीक्षक का उपयोग करके कुछ के साथ आया था

रेग्युलर एक्सप्रेशन सिंटैक्स, विकी सिंटैक्स की तरह एक सा है: उनमें से एक गुच्छा है, वे सभी एक नज़र में एक जैसे दिखते हैं, उनमें से कोई भी स्पष्ट रूप से किसी भी अन्य की तुलना में बेहतर नहीं है, लेकिन कई अंतर हैं।

आज, तथाकथित "पर्ल संगत" नियमित अभिव्यक्ति अधिकांश भाषाओं में डी-फैक्टो डिफ़ॉल्ट हैं, लेकिन विम नियमित अभिव्यक्ति पर्ल-संगत अभिव्यक्तियों के साथ संगत नहीं हैं ! विम regexp सिंटैक्स कम से कम '70 के दशक में वापस चला जाता है, जब पर्ल भी आसपास नहीं था।

आप इसे उपसमूहों के साथ देख सकते हैं, जहाँ आपको उपयोग करना है \(और नहीं ((यह POSIX 'बुनियादी' वाक्य रचना के साथ संगत है, लेकिन अधिक सामान्य POSIX 'विस्तारित' वाक्यविन्यास या पर्ल वाक्यविन्यास के साथ नहीं)। आप इसे \vएक पैटर्न में ध्वज जोड़कर नियंत्रित कर सकते हैं ( :help /\vविवरण के लिए देखें), यह इसे "अधिक संगत" बना देगा, लेकिन पूरी तरह से नहीं ( .{-}उदाहरण के लिए आपको अभी भी गैर-लालची मैचों के लिए उपयोग करना होगा)

तो यह समझा सकता है कि "रेगेक्स टेस्टर" का उपयोग लगभग क्यों किया गया, लेकिन काफी नहीं, काम करता है।

http://www.vimregex.com/ विम रेगेक्स के एक अच्छे अवलोकन / धोखा के रूप में।


1
महान जवाब, खासकर क्यों रेगेक्स! = रेगेक्स के साथ। आपकी खोज और प्रतिस्थापित करने के लिए, यह थोड़ा मुश्किल है क्योंकि टिप्पणी में या नहीं हो सकता है :। विवरण के लिए पूरी फाइल देखें github.com/squarefrog/dotfiles/blob/master/osx/…
squarefrog

8

आप ऐसा कर सकते हैं:

  • उन पंक्तियों की खोज करें जो अंत नहीं हैं #::/[^#]$/
  • #\s(.*)लाइन की शुरुआत में बदलें :s/\v^#\s(.*)/running "\1"/

समूहों का उपयोग करने के लिए, आपको या तो:

  • कोष्ठक से बच जाएं ताकि वे रेगेक्स सिंटैक्स का हिस्सा बन जाएं: \(.*\)या
  • अभिव्यक्ति की शुरुआत करके "जादू" का उपयोग करें \v:s/\v...

इसे मिलाकर:

:/[^#]$/s/\v^#\s(.*)/running "\1"/

1
यह शानदार ढंग से काम करता है, इसके लिए धन्यवाद कि इसमें केवल पाठ के बजाय मेरे द्वारा लिखे जाने वाले पाठ के बजाय टैग का क्या अर्थ है।
स्क्वायरफ्रॉग

यह स्पष्ट करने के लिए धन्यवाद कि रेगेक्स सिंटैक्स का हिस्सा बनने के लिए कोष्ठक से बचना होगा। मुझे हमेशा उनके साथ काम करने में regex समूहों के साथ एक मुद्दा था।
आदमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.