दिलचस्प पोस्ट
कैसे एक JAR फ़ाइल बनाने के लिए जिसमें DLL फ़ाइलें शामिल हैं? c: के लिए हर कोई javax.el.PropertyNotFoundException फेंकता है: संपत्ति 'foo' प्रकार java.lang.String पर नहीं मिला इंटरफ़ेस विधि invocations क्यों ठोस invocations की तुलना में धीमी है? वर्तमान निर्देशिका और फ़ाइल की निर्देशिका खोजें कैसे nginx के कैश को साफ करने के लिए? कैसे बताओ कि कोई सत्र सक्रिय है या नहीं? jquery IE Fadein और Fadeout अपारदर्शिता डिफ़ॉल्ट रूप से सीएमडी.एक्सएक्स में यूनिकोड वर्णसेट कैसे बनाएं? एक MVVM WPF प्रोजेक्ट में एक डेटाग्रिड से एकाधिक आइटम चुनें iPhone NSURL कनेक्शन के साथ पोस्ट भेज रहा है PHP में वेब स्क्रैपर को कैसे कार्यान्वित करें? PHP_AUTH_USER सेट नहीं है? कैसे iPhone एसडीके का उपयोग कर एक GUID / यूआईआईडी बनाने के लिए विंडोज फॉर्म से WPF में संक्रमण MySQL में दो तिथियों के बीच अंतर

क्यों नहीं कई FINDSTR उदाहरण के साथ कई शाब्दिक खोज तार एक मैच मिल रहा है?

निम्न FINDSTR उदाहरण एक मैच को खोजने में विफल रहता है।

echo ffffaaa|findstr /l "ffffaaa faffaffddd" 

क्यूं कर?

वेब के समाधान से एकत्रित समाधान "क्यों नहीं कई FINDSTR उदाहरण के साथ कई शाब्दिक खोज तार एक मैच मिल रहा है?"

उपयुक्त रूप से यह लंबे समय से FINDSTR बग है। मुझे लगता है कि परिस्थितियों के आधार पर यह एक गंभीर बग हो सकता है

मैंने पुष्टि की है कि कमांड दो अलग विस्टा मशीनों, एक विंडोज 7 मशीन और एक एक्सपी मशीन पर विफल हो जाती है। मैं इस findstr मिला – टूटा ??? लिंक जो समान खोज की रिपोर्ट करता है Windows Server 2003 पर विफल रहता है, लेकिन यह Windows 2000 पर सफल होता है

मैंने कई प्रयोग किए हैं और ऐसा लगता है कि निम्न स्थितियों को विफलता की संभावना के लिए पूरा किया जाना चाहिए:

  • खोज कई शाब्दिक खोज तारों का उपयोग कर रहा है
  • खोज स्ट्रिंग विभिन्न लंबाई के हैं
  • एक छोटी खोज स्ट्रिंग में लंबी खोज स्ट्रिंग के साथ कुछ ओवरलैप होते हैं
  • खोज केस संवेदनशील है (कोई भी नहीं /I विकल्प)

हर विफलता में मैंने देखा है, यह हमेशा कम खोज तारों में से एक है जो विफल हो जाता है।

इससे कोई फर्क नहीं पड़ता कि खोज स्ट्रिंग्स को निर्दिष्ट कैसे किया जाता है। एक ही दोषपूर्ण परिणाम कई /C:"search" विकल्पों के साथ और /G:file विकल्प के साथ भी हासिल किया जाता है।

केवल 3 समाधान के साथ आने में सक्षम हैं:

  • यदि आप मामले की परवाह नहीं करते तो /I विकल्प का उपयोग करें जाहिर है यह आपकी ज़रूरतों को पूरा नहीं कर सकता है

  • /R नियमित अभिव्यक्ति विकल्प का उपयोग करें। लेकिन अगर आप ऐसा करते हैं तो आपको यह सुनिश्चित करना होगा कि आप खोज में किसी भी मेटा-वर्ण को छोड़ दें ताकि यह एक शाब्दिक खोज की अपेक्षा परिणाम से मेल खा सके। यह समस्याग्रस्त भी हो सकता है

  • यदि आप /V विकल्प का उपयोग कर रहे हैं, तो एकाधिक खोजों के साथ एक FINDSTR के स्थान पर प्रत्येक खोज स्ट्रिंग के साथ एकाधिक पाइप किए गए FINDSTR आदेशों का उपयोग करें। यह भी एक समस्या हो सकती है यदि आपके पास बहुत सारे खोज स्ट्रिंग हैं जिसके लिए आप /G:file विकल्प का उपयोग करना चाहते हैं।

मैं इस बग से नफरत है !!!!

नोट – देखें Windows FINDSTR कमांड की अनुपयुक्त सुविधाओं और सीमाएं क्या हैं? FINDSTR की एक विस्तृत सूची के लिए स्वतंत्र व्यक्तियों

मैं यह नहीं बता सकता कि findstr कई शाब्दिक तारों के साथ क्यों विफल हो सकता है हालांकि, मैं उस कष्टप्रद बग के आसपास काम करने के लिए एक विधि प्रदान कर सकता हूँ।

यह देखते हुए कि शाब्दिक खोज स्ट्रिंग्स को search_strings.txt नामक एक पाठ फ़ाइल में सूचीबद्ध किया गया है …:

 ffffaaa faffaffddd 

…, आप प्रत्येक एकल वर्ण के सामने एक बैकस्लैश डालने से इसे नियमित अभिव्यक्ति में परिवर्तित कर सकते हैं:

 @echo off setlocal EnableExtensions DisableDelayedExpansion > "regular_expressions.txt" ( for /F usebackq^ delims^=^ eol^= %%S in ("search_strings.txt") do ( set "REGEX=" & set "STRING=%%S" for /F delims^=^ eol^= %%T in (' cmd /U /V /C echo(!STRING!^| find /V "" ') do ( set "ESCCHR=\%%T" if "%%T"="<" (set "ESCCHR=%%T") else if "%%T"=">" (set "ESCCHR=%%T") setlocal EnableDelayedExpansion for /F "delims=" %%U in ("REGEX=!REGEX!!ESCCHR!") do ( endlocal & set "%%U" ) ) setlocal EnableDelayedExpansion echo(!REGEX! endlocal ) ) endlocal 

फिर परिवर्तित फ़ाइल regular_expressions.txt उपयोग करें …:

 \f\f\f\f\a\a\a \f\a\f\f\a\f\f\d\d\d 

… एक नियमित अभिव्यक्ति खोज करने के लिए, जो कई खोज तारों के साथ भी ठीक काम करता है:

 echo ffffaaa| findstr /R /G:"regular_expressions.txt" 

पूर्ववर्ती बैकस्लैश केवल उन प्रत्येक चरित्र से बचते हैं जिनमें नियमित अभिव्यक्ति खोजों में विशेष अर्थ है।

शब्द सीमाओं से टकराव से बचने के लिए अक्षर < और > को बचने से बाहर रखा गया है, जो कि \< और \> शुरुआत से और एक खोज स्ट्रिंग के अंत में दिखाई देते हैं, क्रमशः।

चूंकि नियमित एक्सप्रेशन विंडोज 8 के पिछले संस्करणों के लिए 255 वर्णों तक सीमित हैं, इसलिए मूल खोज स्ट्रिंग की लंबाई 127 वर्णों तक सीमित है, क्योंकि प्रत्येक ऐसे वर्ण को दो वर्णों द्वारा व्यक्त किया जाता है पलायन के कारण


यहां एक वैकल्पिक दृष्टिकोण है जो केवल मेटा-वर्णों को बचाता है . , * , ^ , $ , [ , ] , \ , " :

 @echo off setlocal EnableExtensions DisableDelayedExpansion set "_META=.*^$[]\"^" & rem (including `"`) > "regular_expressions.txt" ( for /F usebackq^ delims^=^ eol^= %%S in ("search_strings.txt") do ( set "REGEX=" & set "STRING=%%S" for /F delims^=^ eol^= %%T in (' cmd /U /V /C echo(!STRING!^| find /V "" ') do ( set "CHR=%%T" setlocal EnableDelayedExpansion if not "!_META!"=="!_META:*%%T=!" set "CHR=\!CHR!" for /F "delims=" %%U in ("REGEX=!REGEX!!CHR!") do ( endlocal & set "%%U" ) ) setlocal EnableDelayedExpansion echo(!REGEX! endlocal ) ) endlocal 

इस पद्धति का लाभ यह है कि खोज स्ट्रिंग की लंबाई अब 127 वर्णों तक सीमित नहीं है, लेकिन प्रत्येक उत्पन्न होने वाली उपर्युक्त मेटा-वर्ण के लिए 254 वर्ण शून्य से 1, Windows XP के पिछले संस्करणों के लिए findstr संस्करणों के लिए आवेदन करना।


यहां एक और काम है- पहले स्थान पर findstr साथ केस-असंवेदनशील खोज का उपयोग करके, फिर मामले-संवेदनशील तुलना करके परिणाम को छानने के बाद:

 echo ffffaaa|findstr /L /I "ffffaaa faffaffddd"|cmd /V /C set /P STR=""^&if @^^!STR^^!==@^^!STR:ffffaaa=ffffaaa^^! (echo(^^!STR^^!) else if @^^!STR^^!==@^^!STR:faffaffddd=faffaffddd^^! (echo(^^!STR^^!) 

डबल-एस्केप्ड विस्मयादिबोधक चिह्न सुनिश्चित करता है कि चर STR स्पष्ट रूप से लागू cmd उदाहरण में विस्तारित हो गया है, भले ही होस्टिंग cmd इंस्टेंस में देरी से विस्तार सक्षम हो।


वैसे, जो मैं एक डिजाइन दोष को कॉल करता हूं, findstr का इस्तेमाल करते हुए शाब्दिक स्ट्रिंग्स की खोज करते हैं, जैसे कि वे बैकस्लैश होते हैं, क्योंकि इन्हें मेटा-वर्णों के बाद भी बचने के लिए उपयोग किया जा सकता है, हालांकि आवश्यक नहीं है; उदाहरण के लिए, खोज स्ट्रिंग \. वास्तव में मैच ; वास्तव में मिलान करने के लिए \. सचमुच, आपको खोज स्ट्रिंग निर्दिष्ट करना होगा \\. । मुझे समझ में नहीं आ रहा है कि क्यों मेटा-वर्ण अभी भी वास्तविक खोज करते समय पहचाने जाते हैं, यह वही नहीं है जो मैं शाब्दिक कहता हूं।