2010-03-24 12 views
8

में regexp उलटा करें स्टैक ओवरफ़्लो पर कुछ "मैं regexp को कैसे उलटा कर सकता हूं" प्रश्न हैं, लेकिन मुझे विम के लिए कोई नहीं मिल रहा है (यदि यह मौजूद है, तो मेरा Google-fu आज की कमी है)।विम

संक्षेप में मैं सभी प्रिंट न हो सकने वर्णों से मेल और उन्हें हटाना चाहते हैं। मैं एक छोटी लिपि लिख सकता हूं, या एक खोल को छोड़ सकता हूं और टी या कुछ हटाने के समान उपयोग कर सकता हूं, लेकिन एक विम समाधान डैंडी होगा :-)

विम पर प्रिंट करने योग्य पात्रों से मेल खाने के लिए परमाणु \p है, हालांकि ऐसा करने का प्रयास उलटा मिलान करने के लिए :s/[^\p]//g विफल रहा और बस मुझे फ़ाइल में प्रत्येक 'पी' के साथ छोड़ दिया। मैंने अन्य प्रश्नों में (?!xxx) अनुक्रम देखा है, और विम इस अनुक्रम को पहचानने के लिए प्रतीत नहीं होता है। मुझे गैर-प्रिंट करने योग्य वर्णों के लिए परमाणु नहीं मिला है।

अंतरिम में, मैं बाहरी उपकरण के लिए छोड़ जा रहा हूँ, लेकिन अगर किसी को भी किसी भी चाल ऊपर यह करने के लिए अपने आस्तीन मिला है, यह स्वागत :-)

टा होगी!

+0

पर्ल/PCRE '(?! Xxx)' अभिव्यक्ति '\ (xxx \) \ @!' विम अभिव्यक्ति के रूप में एक ही अर्थ नहीं है, लेकिन मुझे नहीं लगता कि यह आप में मदद मिलेगी है। – ZyX

उत्तर

10

दुर्भाग्य से आप चरित्र कक्षाओं में \p नहीं डाल सकते हैं, हालांकि यह एक अच्छा फीचर होगा। हालांकि यदि आप अपनी खोज के निर्माण के लिए नकारात्मक-अग्रदर्शी सुविधा \@! उपयोग कर सकते हैं:

/\p\@!. 

यह पहले सुनिश्चित करें कि . केवल मिलान कर सकते हैं जब यह एक \p चरित्र नहीं है कर देगा।

+0

शीर्ष सामग्री - उसने नौकरी की, चीयर्स :-) –

1

मैं तुम क्यों \ p उपयोग नहीं कर सकते भी एक छोटे से हैरान हूँ। लेकिन, [: प्रिंट:] ठीक काम करता है:

:s/[^[:print:]]//g 
+2

यह यूनिकोड का समर्थन नहीं करता है: 'echo "Å" = ~' [[: print:]] '"Å" = ~' \ p'' परिणाम '0 1' में होता है। – ZyX

+2

@ZyX: अच्छी पकड़। मुझे आश्चर्य है कि क्यों '[: प्रिंट:] 'प्रिंट करने योग्य यूनिकोड वर्ण शामिल नहीं है? – Cascabel

+0

(दो साल बाद) ... मैं विम का कौन सा संस्करण मैं मूल रूप से इस प्रश्न पूछा याद नहीं कर सकते, लेकिन vim 7.3 (क्या मैं इस समय स्थापित किया है) के रूप में, '[: प्रिंट:]' यूनिकोड का समर्थन करता है , और उपरोक्त @ZyX से (सही ढंग से) '1 1' देता है। –

1

आप यूनिकोड के साथ फ़ाइल फ़िल्टर करना चाहते हैं मुद्रण योग्य पात्रों, आप तीन चरणों में ऐसा कर सकता है (fileencoding = UTF-8 केवल तभी): के साथ सभी प्रिंट करने योग्य पात्रों को चिह्नित (

%s/\p\@<=/<ffff>/g 
%s/[^<ffff>]<ffff>\@!//g 
%s/<ffff>//g 

यहाँ आप वास्तविक चरित्र के साथ <ffff> बदलना होगा: नहीं इस्तेमाल किया UTF-8 प्रतीक (उदाहरण के लिए, nr2char(0xFFFF) के साथ), सभी वर्ण, कि इस संकेत से पालन नहीं कर रहे हटा सकते हैं और, अंत में, इस प्रतीक को नष्ट यदि आप इसे टाइप करते हैं, तो <ffff> टाइप करें)।

आप यूनिकोड के साथ काम नहीं कर रहे हैं, तो dsummersl के जवाब का उपयोग करें।