प्रस्तावना
इस जवाब में दी गई जानकारी के बहुत इकट्ठा किया एक Vista मशीन पर चलने प्रयोगों के आधार पर किया गया है। जब तक स्पष्ट रूप से अन्यथा नहीं कहा जाता है, मैंने पुष्टि नहीं की है कि क्या जानकारी अन्य विंडोज संस्करणों पर लागू होती है।
FINDSTR आउटपुट
प्रलेखन FINDSTR के आउटपुट को समझाने के लिए कभी भी परेशान नहीं करता है। यह इस तथ्य की ओर संकेत करता है कि मिलान रेखाएँ मुद्रित होती हैं, लेकिन इससे अधिक कुछ नहीं।
मिलान लाइन आउटपुट का प्रारूप इस प्रकार है:
फ़ाइल नाम: LineNumber: lineOffset: पाठ
कहाँ पे
fileName: = फाइल का नाम जिसमें मैचिंग लाइन है। फ़ाइल का नाम मुद्रित नहीं किया जाता है यदि अनुरोध एकल फ़ाइल के लिए स्पष्ट रूप से किया गया था, या यदि पाइप किए गए इनपुट या पुनर्निर्देशित इनपुट की खोज कर रहा है। जब प्रिंट किया जाता है, तो फ़ाइलनाम में हमेशा प्रदान की गई कोई भी जानकारी शामिल होगी। यदि/S
विकल्प का उपयोग किया जाता हैतो अतिरिक्त पथ जानकारी जोड़ी जाएगी। मुद्रित पथ हमेशा उपलब्ध पथ के सापेक्ष होता है, या वर्तमान निर्देशिका के सापेक्ष यदि कोई नहीं प्रदान करता है।
नोट - फ़ाइल नाम उपसर्ग जब का उपयोग करके एकाधिक फ़ाइलों को खोज कर बचा जा सकता है गैर मानक (और खराब प्रलेखित) वाइल्डकार्ड <
और >
। ये वाइल्डकार्ड कैसे काम करते हैं, इसके सटीक नियम यहां देखे जा सकते हैं । अंत में, आप इस उदाहरण को देख सकते हैं कि FINDSTR के साथ गैर-मानक वाइल्डकार्ड कैसे काम करते हैं ।
लाइननंबर: = 1 लाइन के इनपुट के साथ 1 के साथ एक दशमलव मान के रूप में प्रतिनिधित्व लाइन की लाइन संख्या। यदि/N
विकल्प निर्दिष्टकिया गया है तो केवल मुद्रित।
लाइनऑफसेट: = 1 लाइन के 1 वर्ण का प्रतिनिधित्व करने के साथ मिलान रेखा की शुरुआत का दशमलव बाइट ऑफसेट। यदि/O
विकल्प निर्दिष्टकिया गया है तो केवल मुद्रित। यहलाइन के भीतर मैच की भरपाई नहीं है। यह फ़ाइल की शुरुआत से पंक्ति की शुरुआत तक बाइट्स की संख्या है।
पाठ = किसी भी <CR> और / या <LF> सहित मिलान रेखा का द्विआधारी प्रतिनिधित्व। बाइनरी आउटपुट से कुछ भी नहीं बचा है, जैसे कि यह उदाहरण जो सभी लाइनों से मेल खाता है, मूल फ़ाइल की एक सटीक बाइनरी कॉपी का उत्पादन करेगा।
FINDSTR "^" FILE >FILE_COPY
/ A विकल्प फ़ाइल का नाम सेट करता है: नाम: लाइननंबर :, और लाइनऑफ़सेट: केवल आउटपुट। मिलान लाइन का पाठ हमेशा वर्तमान कंसोल रंग के साथ आउटपुट होता है। / A विकल्प का केवल तभी प्रभाव होता है जब आउटपुट सीधे कंसोल पर प्रदर्शित होता है। यदि आउटपुट को फ़ाइल या पाइप पर रीडायरेक्ट किया जाता है तो / A विकल्प का कोई प्रभाव नहीं पड़ता है। देखें Aacini के जवाब में 2018/08/18 संपादित करें जब उत्पादन CON पर भेज दिया जाएगा गाड़ी व्यवहार के वर्णन के लिए।
अधिकांश नियंत्रण वर्ण और कई विस्तारित ASCII वर्ण XP पर डॉट्स के रूप में प्रदर्शित
होते हैं, XP पर FINDSTR स्क्रीन पर डॉट्स (अवधि) के रूप में मिलान लाइनों से अधिकांश गैर-मुद्रण योग्य नियंत्रण वर्ण प्रदर्शित करता है। निम्नलिखित नियंत्रण वर्ण अपवाद हैं; वे स्वयं के रूप में प्रदर्शित होते हैं: 0x09 टैब, 0x0A लाइनफीड, 0x0B वर्टिकल टैब, 0x0C फॉर्म फ़ीड, 0x0D कैरिज रिटर्न।
XP FINDSTR भी कई विस्तृत ASCII वर्णों को डॉट्स में कनवर्ट करता है। विस्तारित ASCII वर्ण जो XP पर डॉट्स के रूप में प्रदर्शित होते हैं, वे वही होते हैं जो कमांड लाइन पर आपूर्ति किए जाने पर बदल जाते हैं। देखें - "विस्तारित ASCII परिवर्तन आदेश पंक्ति पैरामीटर की वर्ण सीमा पर" अनुभाग में, बाद में इस पोस्ट में
नियंत्रण वर्ण और विस्तारित ASCII एक्सपी पर डॉट्स में परिवर्तित नहीं होते हैं यदि आउटपुट पाइप किया जाता है, तो फ़ाइल के लिए पुनर्निर्देशित किया जाता है, या फॉर इन () क्लॉज़ के भीतर।
विस्टा और विंडोज 7 हमेशा सभी पात्रों को खुद के रूप में प्रदर्शित करते हैं, कभी डॉट्स के रूप में नहीं।
रिटर्न कोड (ERRORLEVEL)
- 0 (सफलता)
- मैच कम से कम एक फ़ाइल की एक पंक्ति में पाया गया था।
- 1 (विफलता)
- किसी भी फाइल की किसी भी लाइन में कोई मेल नहीं मिला।
/A:xx
विकल्प द्वारा निर्दिष्ट अमान्य रंग
- 2 (त्रुटि)
- असंगत विकल्प
/L
और /R
दोनों निर्दिष्ट
- गुम तर्क के बाद
/A:
, /F:
, /C:
, /D:
, या/G:
- द्वारा निर्दिष्ट
/F:file
या /G:file
नहीं मिली फ़ाइल
- 255 (त्रुटि)
खोज करने के लिए डेटा का स्रोत (विंडोज 7 के साथ परीक्षणों पर आधारित अद्यतन)
Findstr निम्नलिखित स्रोतों में से केवल एक से डेटा खोज सकता है:
फ़ाइल नाम तर्क और / या /F:file
विकल्प का उपयोग करके निर्दिष्ट किया गया है।
स्टड पुनर्निर्देशन के माध्यम से findstr "searchString" <file
एक पाइप से डेटा स्ट्रीम type file | findstr "searchString"
तर्क / विकल्प पुनर्निर्देशन पर पूर्वता लेते हैं, जो कि पाइप किए गए डेटा पर पूर्वता लेता है।
फ़ाइल नाम तर्क और /F:file
संयुक्त हो सकता है। एकाधिक फ़ाइल नाम तर्क का उपयोग किया जा सकता है। यदि कई /F:file
विकल्प निर्दिष्ट किए जाते हैं, तो केवल पिछले एक का उपयोग किया जाता है। फ़ाइल नाम तर्कों में वाइल्ड कार्ड की अनुमति दी जाती है, लेकिन इसके द्वारा बताई गई फ़ाइल के भीतर नहीं /F:file
।
तलाश किए जाने के स्रोत (विंडोज 7 के साथ परीक्षण के आधार पर अपडेट किया गया) और विकल्प जोड़ा जा सकता है। कई विकल्प निर्दिष्ट किए जा सकते हैं। यदि कई विकल्प निर्दिष्ट किए जाते हैं, तो केवल पिछले एक का उपयोग किया जाता है। यदि दोनों में से या प्रयोग किया जाता है, तो सभी गैर विकल्प तर्क खोज करने के लिए फ़ाइलों को माना जाता है। तो न तो है और न ही प्रयोग किया जाता है, तो पहली गैर विकल्प तर्क खोज पदों की एक अंतरिक्ष सीमांकित सूची के रूप में व्यवहार किया जाता है।
/G:file
/C:string
/C:string
/G:file
/G:file
/C:string
/G:file
/C:string
/F:FILE
विकल्प का उपयोग करते समय फ़ाइल के नाम फ़ाइल के भीतर उद्धृत नहीं किए जाने चाहिए ।
फ़ाइल नामों में स्थान और अन्य विशेष वर्ण हो सकते हैं। अधिकांश आदेशों के लिए आवश्यक है कि ऐसे फ़ाइल नाम उद्धृत किए जाएं। लेकिन FINDSTR /F:files.txt
ऑप्शन के लिए जरूरी है कि files.txt के भीतर फाइलनाम को उद्धृत नहीं किया जाना चाहिए। यदि नाम उद्धृत किया गया है तो फ़ाइल नहीं मिलेगी।
बग - लघु 8.3 फ़ाइल नाम /D
और /S
विकल्प तोड़ सकते हैं
सभी विंडोज़ कमांड के साथ, FINDSTR खोज करने के लिए फ़ाइलों की तलाश करते समय लंबे नाम और संक्षिप्त 8.3 नाम दोनों का मिलान करने का प्रयास करेगा। मान लें कि वर्तमान फ़ोल्डर में निम्न गैर-रिक्त फ़ाइलें हैं:
b1.txt
b.txt2
c.txt
निम्न आदेश सभी 3 फ़ाइलों को सफलतापूर्वक मिल जाएगा:
findstr /m "^" *.txt
b.txt2
मेल खाता है क्योंकि इसी संक्षिप्त नाम से B9F64~1.TXT
मेल खाता है। यह अन्य सभी विंडोज कमांड के व्यवहार के अनुरूप है।
लेकिन साथ एक बग /D
और /S
विकल्प केवल खोजने के लिए निम्न कमांड का कारण बनता हैb1.txt
findstr /m /d:. "^" *.txt
findstr /m /s "^" *.txt
बग ढूंढे जाने b.txt2
से रोकता है, साथ ही सभी फ़ाइल नाम जो b.txt2
एक ही डायरेक्टरी के बाद सॉर्ट करते हैं। अतिरिक्त फ़ाइलें जो पहले सॉर्ट करती हैं, जैसे a.txt
, पाई जाती हैं। अतिरिक्त फ़ाइलें जो बाद में सॉर्ट करती हैं, जैसे d.txt
बग को ट्रिगर किए जाने के बाद याद आती हैं।
खोज की गई प्रत्येक निर्देशिका को स्वतंत्र रूप से व्यवहार किया जाता है। उदाहरण के लिए, /S
विकल्प माता-पिता की फ़ाइलों को खोजने में विफल होने के बाद बच्चे के फ़ोल्डर में सफलतापूर्वक खोजना शुरू कर देगा, लेकिन एक बार बग के कारण बच्चे में एक छोटी फ़ाइल का नाम छूट जाता है, तो उस बच्चे के फ़ोल्डर में बाद की सभी फाइलें भी छूट जाएगी। ।
यदि NTFS 8.3 नाम पीढ़ी अक्षम मशीन पर समान फ़ाइल नाम बनाए जाते हैं, तो कमांड बग मुक्त काम करती है। बेशक b.txt2
नहीं मिलेगा, लेकिन c.txt
ठीक से मिल जाएगा।
सभी छोटे नाम बग को ट्रिगर नहीं करते हैं। बिगड़े हुए व्यवहार के सभी उदाहरणों में मैंने एक विस्तार को शामिल किया है जो कि छोटे अक्षरों में 3 छोटे से 8.3 नाम से अधिक लंबा है जो सामान्य नाम के समान शुरू होता है जिसमें 8.3 नाम की आवश्यकता नहीं होती है।
XP, विस्टा और विंडोज 7 पर बग की पुष्टि की गई है।
गैर मुद्रण योग्य पात्रों और /P
विकल्प विकल्प findstr कि निम्नलिखित दशमलव बाइट कोड के किसी भी ऐसी कोई भी फ़ाइल को छोड़ने के लिए कारण बनता है:
0-7, 14-25, 27-31।
/P
एक और तरीका रखो, /P
विकल्प केवल उन फ़ाइलों को छोड़ देगा जिनमें गैर-मुद्रण योग्य नियंत्रण वर्ण हैं। नियंत्रण वर्ण 31 (0x1F) से कम या बराबर कोड हैं। FINDSTR निम्नलिखित नियंत्रण वर्णों को मुद्रण योग्य मानता है:
8 0x08 backspace
9 0x09 horizontal tab
10 0x0A line feed
11 0x0B vertical tab
12 0x0C form feed
13 0x0D carriage return
26 0x1A substitute (end of text)
अन्य सभी नियंत्रण वर्णों को गैर-मुद्रण योग्य माना जाता है, जिनमें से उपस्थिति /P
फ़ाइल को छोड़ने का विकल्प देती है।
पाइप्ड और रीडायरेक्ट किए गए इनपुट ने <CR><LF>
जोड़ा हो सकता है
यदि इनपुट को पाइप में <LF>
डाला गया है और स्ट्रीम का अंतिम वर्ण नहीं है , तो FINDSTR स्वचालित रूप <CR><LF>
से इनपुट के लिए अपील करेगा । एक्सपी, विस्टा और विंडोज 7 पर इसकी पुष्टि की गई है (मैं समझता था कि इनपुट को संशोधित करने के लिए विंडोज पाइप जिम्मेदार था, लेकिन मुझे तब से पता चला है कि FINDSTR वास्तव में संशोधन कर रहा है।)
विस्टा पर पुनर्निर्देशित इनपुट के लिए भी यही सच है। यदि पुनर्निर्देशित इनपुट के रूप में उपयोग की गई फ़ाइल का अंतिम वर्ण नहीं है <LF>
, तो FINDSTR स्वचालित रूप <CR><LF>
से इनपुट में संलग्न हो जाएगा । हालाँकि, XP और Windows 7 पुनर्निर्देशित इनपुट को परिवर्तित नहीं करते हैं।
XP और Windows 7 पर FINDSTR हैंग होता है, यदि पुनर्निर्देशित इनपुट समाप्त नहीं होता है, तो<LF>
यह XP और Windows 7 पर एक बुरा "सुविधा" है। यदि पुनर्निर्देशित इनपुट के रूप में उपयोग की गई फ़ाइल का अंतिम वर्ण समाप्त नहीं होता है <LF>
, तो FINDSTR एक बार इसे अनिश्चित काल तक लटका देगा। पुनर्निर्देशित फ़ाइल के अंत तक पहुँचता है।
पाइप्ड डेटा की अंतिम पंक्ति को अनदेखा किया जा सकता है यदि इसमें एक एकल वर्ण शामिल हो।
यदि इनपुट में पाइप है और अंतिम पंक्ति में एकल वर्ण है <LF>
, जिसका अनुसरण नहीं किया जाता है , तो FINDSTR अंतिम पंक्ति को पूरी तरह से अनदेखा कर देता है।
उदाहरण - एक एकल वर्ण वाला पहला कमांड और कोई भी <LF>
मेल करने में विफल रहता है, लेकिन 2 वर्णों वाला दूसरा कमांड ठीक काम करता है, जैसा कि तीसरा आदेश है जिसमें एक चरित्र नईलाइन समाप्त करने के साथ है।
> set /p "=x" <nul | findstr "^"
> set /p "=xx" <nul | findstr "^"
xx
> echo x| findstr "^"
x
DosTips उपयोगकर्ता स्पंज बेली द्वारा नए खोज पथ पर रिपोर्ट किया गया । XP, विंडोज 7 और विंडोज 8 पर पुष्टि की। विस्टा के बारे में अभी तक नहीं सुना। (मैं अब परीक्षण करने के लिए Vista नहीं है)।
विकल्प वाक्य रचना
विकल्प के साथ या तो पहले से जुड़ा हुआ जा सकता है /
या -
विकल्प एक एकल के बाद concatenated किया जा सकता है /
या -
। हालाँकि, संक्षिप्त विकल्प सूची में अधिकांश एक मल्टीचैकर विकल्प जैसे कि OFF या F :, हो सकता है और बहु-वर्ण विकल्प सूची में अंतिम विकल्प होना चाहिए।
किसी भी लाइन के लिए असंवेदनशील रेगेक्स सर्च को व्यक्त करने के सभी समान तरीके निम्नलिखित हैं, जिसमें किसी भी क्रम में "हैलो" और "अलविदा" दोनों शामिल हैं।
/i /r /c:"hello.*goodbye" /c:"goodbye.*hello"
-i -r -c:"hello.*goodbye" /c:"goodbye.*hello"
/irc:"hello.*goodbye" /c:"goodbye.*hello"
खोज स्ट्रिंग लंबाई सीमा
विस्टा पर एक खोज स्ट्रिंग के लिए अधिकतम अनुमत लंबाई 511 बाइट्स है। यदि कोई खोज स्ट्रिंग 511 से अधिक है तो परिणाम FINDSTR: Search string too long.
ERRORLEVEL 2 के साथ एक त्रुटि है।
एक नियमित अभिव्यक्ति खोज करते समय, अधिकतम खोज स्ट्रिंग लंबाई 254 है। 255 और 511 के बीच की लंबाई के साथ एक नियमित अभिव्यक्ति FINDSTR: Out of memory
ERRORLEVEL 2 के साथ त्रुटि होगी। एक नियमित अभिव्यक्ति लंबाई> 511 FINDSTR: Search string too long.
त्रुटि में परिणाम ।
Windows XP पर खोज स्ट्रिंग की लंबाई जाहिरा तौर पर कम है। त्रुटि का पता लगाएं: "खोज स्ट्रिंग बहुत लंबी है": "लूप" के लिए "सबस्ट्रिंग" कैसे निकालें और मैच करें?
XP की सीमा शाब्दिक और रीगेक्स दोनों खोजों के लिए 127 बाइट्स है।
लाइन की लंबाई सीमा
कमांड लाइन तर्क के रूप में या / F: FILE विकल्प के रूप में निर्दिष्ट फ़ाइलों की कोई ज्ञात लाइन लंबाई सीमा नहीं है। खोजों को सफलतापूर्वक एक 128 एमबी फ़ाइल के खिलाफ चलाया गया था जिसमें एक भी <LF> नहीं था।
पाइप्ड डेटा और रीडायरेक्टेड इनपुट 8191 बाइट्स प्रति पंक्ति तक सीमित है। यह सीमा FINDSTR की "सुविधा" है। यह पाइप या पुनर्निर्देशन के लिए अंतर्निहित नहीं है। रीडायरेक्ट किए गए स्टडिन या पाइप किए गए इनपुट का उपयोग करने वाला FINDSTR कभी भी किसी भी लाइन से मेल नहीं खाता जो> = 8k बाइट्स हो। लाइन्स> = 8k stderr के लिए एक त्रुटि संदेश उत्पन्न करता है, लेकिन खोज स्ट्रिंग कम से कम एक फ़ाइल के कम से कम एक लाइन में पाए जाने पर अभी भी 0 है।
डिफ़ॉल्ट प्रकार की खोज: शाब्दिक बनाम नियमित अभिव्यक्ति
/C:"string"
- डिफ़ॉल्ट / एल शाब्दिक है। स्पष्ट रूप से / L विकल्प को / C: "string" के साथ संयोजित करना निश्चित रूप से काम करता है लेकिन बेमानी है।
"string argument"
- डिफ़ॉल्ट बहुत पहले खोज स्ट्रिंग की सामग्री पर निर्भर करता है। (याद रखें कि सर्च स्पेस को डिलीट करने के लिए <space> का उपयोग किया जाता है।) यदि पहली सर्च स्ट्रिंग एक वैध रेग्युलर एक्सप्रेशन है जिसमें कम से कम एक अन-एस्केप्ड मेटा-कैरेक्टर होता है, तो सभी सर्च स्ट्रिंग्स को रेगुलर एक्सप्रेशन के रूप में माना जाता है। अन्यथा सभी खोज तारों को शाब्दिक माना जाता है। उदाहरण के लिए, "51.4 200"
दो नियमित अभिव्यक्तियों के रूप में माना जाएगा क्योंकि पहले स्ट्रिंग में एक अन-एस्केप डॉट है, जबकि "200 51.4"
दो शाब्दिक के रूप में माना जाएगा क्योंकि पहले स्ट्रिंग में कोई मेटा-वर्ण नहीं है।
/G:file
- डिफ़ॉल्ट फ़ाइल में पहली गैर-खाली लाइन की सामग्री पर निर्भर करता है। यदि पहली खोज स्ट्रिंग एक वैध नियमित अभिव्यक्ति है जिसमें कम से कम एक अन-एस्केप्ड मेटा-चरित्र है, तो सभी खोज स्ट्रिंग को नियमित अभिव्यक्ति के रूप में माना जाता है। अन्यथा सभी खोज तारों को शाब्दिक माना जाता है।
सिफ़ारिश - हमेशा स्पष्ट रूप से निर्दिष्ट /L
शाब्दिक विकल्प या /R
का उपयोग करते समय नियमित अभिव्यक्ति विकल्प "string argument"
या /G:file
।
बग - कई शाब्दिक खोज स्ट्रिंग निर्दिष्ट करना अविश्वसनीय परिणाम दे सकता है
निम्नलिखित सरल FINDSTR उदाहरण एक मैच खोजने में विफल रहता है, भले ही यह होना चाहिए।
echo ffffaaa|findstr /l "ffffaaa faffaffddd"
इस बग की पुष्टि विंडोज सर्वर 2003, विंडोज एक्सपी, विस्टा और विंडोज 7 पर की गई है।
प्रयोगों के आधार पर, FINDSTR विफल हो सकता है यदि निम्न में से सभी शर्तें पूरी हों:
- खोज कई शाब्दिक खोज स्ट्रिंग का उपयोग कर रही है
- खोज के तार अलग-अलग लंबाई के होते हैं
- एक छोटी खोज स्ट्रिंग में लंबी खोज स्ट्रिंग के साथ ओवरलैप की कुछ मात्रा होती है
- खोज मामला संवेदनशील है (कोई
/I
विकल्प नहीं )
मैंने जो भी असफलताएँ देखीं, उनमें यह हमेशा कम खोज के तार हैं जो विफल होते हैं।
अधिक जानकारी के लिए यह देखें कि यह FINDSTR उदाहरण कई शाब्दिक खोज स्ट्रिंग के साथ मेल खाने के लिए क्यों नहीं है?
कमांड लाइन तर्कों के भीतर उद्धरण और बैकस्लैस
नोट - उपयोगकर्ता एमसी एनडी की टिप्पणियां इस खंड के लिए वास्तविक रूप से जटिल नियमों को दर्शाती हैं। इसमें 3 अलग-अलग पार्सिंग चरण शामिल हैं:
- पहले cmd.exe को कुछ उद्धरणों के लिए ^ के रूप में भाग जाने की आवश्यकता हो सकती है "(वास्तव में FINDSTR से कोई लेना देना नहीं है)
- अगला FINDSTR पूर्व 2008 MS C / C ++ तर्क पार्सर का उपयोग करता है , जिसमें "और \" के विशेष नियम हैं
- तर्क पार्सर के खत्म होने के बाद, FINDSTR इसके अलावा एक अल्फा-न्यूमेरिक कैरेक्टर को शाब्दिक रूप से मानता है, लेकिन \ N ने अल्फ़ा-न्यूमेरिक कैरेक्टर को एक एस्केप कैरेक्टर के रूप में देखा।
इस हाइलाइट किए गए सेक्शन का शेष भाग 100% सही नहीं है। यह कई स्थितियों के लिए एक मार्गदर्शक के रूप में काम कर सकता है, लेकिन कुल समझ के लिए उपरोक्त नियमों की आवश्यकता है।
कमांड लाइन सर्च स्ट्रिंग्स के भीतर क्वैश्चन क्विटिंग कमांड लाइन सर्च स्ट्रिंग्स के
भीतर उद्धरण जैसे बैकस्लैश के साथ बच जाना चाहिए
\"
। यह शाब्दिक और रेगेक्स दोनों खोज स्ट्रिंग के लिए सही है। यह जानकारी XP, विस्टा और विंडोज 7 पर पुष्टि की गई है।
नोट: बोली को CMD.EXE पार्सर के लिए भी भाग जाने की आवश्यकता हो सकती है, लेकिन इसका FINDSTR से कोई लेना-देना नहीं है। उदाहरण के लिए, आपके द्वारा उपयोग किए जा सकने वाले एकल उद्धरण की खोज करने के लिए:
FINDSTR \^" file && echo found || echo not found
कमांड लाइन शाब्दिक खोज स्ट्रिंग के भीतर बैकस्लैश से बचना शाब्दिक खोज स्ट्रिंग में
बैकस्लैश को सामान्य रूप से \
या के रूप में दर्शाया जा सकता है
\\
। वे आम तौर पर समकक्ष हैं। (विस्टा में असामान्य मामले हो सकते हैं जहां बैकस्लैश को हमेशा बच जाना चाहिए, लेकिन मेरे पास अब परीक्षण करने के लिए विस्टा मशीन नहीं है) ।
लेकिन कुछ विशेष मामले हैं:
जब लगातार बैकस्लैश की खोज की जाती है, तो सभी को अंतिम रूप से बच जाना चाहिए। अंतिम बैकलैश वैकल्पिक रूप से बच सकता है।
\\
\\\
या के रूप में कोडित किया जा सकता है\\\\
\\\
\\\\\
या के रूप में कोडित किया जा सकता है\\\\\\
एक उद्धरण से पहले एक या अधिक बैकस्लैश की खोज करना विचित्र है। तर्क का सुझाव होगा कि उद्धरण से बच जाना चाहिए, और प्रत्येक अग्रणी बैकस्लैश से बचना होगा, लेकिन यह काम नहीं करता है! इसके बजाय, प्रत्येक प्रमुख बैकस्लैश को डबल बच जाना चाहिए, और उद्धरण सामान्य रूप से बच जाता है:
\"
के रूप में कोडित होना चाहिए \\\\\"
\\"
के रूप में कोडित होना चाहिए \\\\\\\\\"
जैसा कि पहले उल्लेख किया गया है, एक या अधिक बच गए उद्धरणों ^
को सीएमडी पार्सर के साथ भागने की भी आवश्यकता हो सकती है
इस खंड की जानकारी की पुष्टि XP और विंडोज 7 पर की गई है।
कमांड लाइन regex खोज स्ट्रिंग्स के भीतर बैकस्लैश से बचना
केवल विस्टा: एक रेक्स में बैकस्लैश या तो डबल बच जाना चाहिए \\\\
, या फिर एक चरित्र वर्ग के भीतर एक जैसे बच गए
[\\]
XP और विंडोज 7: एक रेक्स में बैकस्लैश को हमेशा के रूप में दर्शाया जा सकता है [\\]
। इसे सामान्य रूप से दर्शाया जा सकता है \\
। लेकिन यह कभी काम नहीं करता है यदि बैकस्लैश एक बची हुई बोली से पहले हो।
एक बची हुई बोली से पहले एक या एक से अधिक बैकस्लैश या तो डबल बच जाना चाहिए, या अन्य के रूप में कोडित किया जाना चाहिए [\\]
\"
के रूप में \\\\\"
या कोडित किया जा सकता है[\\]\"
\\"
के रूप में कोडित किया जा सकता है \\\\\\\\\"
या [\\][\\]\"
या\\[\\]\"
/ G के भीतर उद्धरण और बैकस्लैश से बचना: FILE शाब्दिक खोज स्ट्रिंग
स्टैंडअलोन उद्धरण और बैकस्लैश / G द्वारा निर्दिष्ट शाब्दिक खोज स्ट्रिंग फ़ाइल के भीतर: फ़ाइल की जरूरत नहीं है, लेकिन वे हो सकते हैं।
"
और \"
बराबर हैं।
\
और \\
बराबर हैं।
यदि इरादा \\ खोजना है, तो कम से कम अग्रणी बैकस्लैश से बच जाना चाहिए। दोनों \\\
और \\\\
काम।
आशय को खोजने के लिए \ "है, तो कम से कम प्रमुख बैकस्लैश भाग निकले किया जाना चाहिए। दोनों \\"
और \\\"
काम करते हैं।
/ G के भीतर उद्धरण और बैकस्लैश
से बचना : FILE रेगेक्स सर्च स्ट्रिंग्स यह एक ऐसा मामला है जहां प्रलेखन के आधार पर भागने के क्रम अपेक्षित रूप से काम करते हैं। उद्धरण एक रेगेक्स मेटाचैकर नहीं है, इसलिए इसे भागने (लेकिन हो सकता है) की आवश्यकता नहीं है। बैकस्लैश एक रेगीक्स मेटाचैकर है, इसलिए इसे बचना चाहिए।
कमांड लाइन मापदंडों के लिए वर्ण सीमाएँ - विस्तारित ASCII परिवर्तन
शून्य वर्ण (0x00) कमांड लाइन पर किसी भी स्ट्रिंग में दिखाई नहीं दे सकता है। किसी भी अन्य एकल बाइट चरित्र स्ट्रिंग (0x01 - 0xFF) में दिखाई दे सकते हैं। हालाँकि, FINDSTR ने कई विस्तारित ASCII वर्णों को धर्मान्तरित किया जो इसे कमांड लाइन मापदंडों के भीतर अन्य वर्णों में पाता है। इसका दो तरह से प्रभाव पड़ता है:
1) कई विस्तारित ASCII वर्ण कमांड लाइन पर खोज स्ट्रिंग के रूप में उपयोग किए जाने पर स्वयं से मेल नहीं खाएंगे। यह सीमा शाब्दिक और रीगेक्स खोजों के लिए समान है। यदि खोज स्ट्रिंग में विस्तृत ASCII होना चाहिए, तो /G:FILE
इसके बजाय विकल्प का उपयोग किया जाना चाहिए।
2) FINDSTR फ़ाइल को खोजने में विफल हो सकता है यदि नाम में ASCII वर्ण हैं और कमांड लाइन पर फ़ाइल का नाम निर्दिष्ट है। यदि खोज की जाने वाली फ़ाइल में नाम में ASCII विस्तारित है, तो /F:FILE
इसके बजाय विकल्प का उपयोग किया जाना चाहिए।
यहाँ विस्तृत ASCII वर्ण परिवर्तनों की पूरी सूची है, जो FINDSTR कमांड लाइन स्ट्रिंग्स पर करता है। प्रत्येक चरित्र को दशमलव बाइट कोड मान के रूप में दर्शाया गया है। पहला कोड कमांड लाइन पर दिए गए चरित्र का प्रतिनिधित्व करता है, और दूसरा कोड उस चरित्र का प्रतिनिधित्व करता है जिसे यह रूपांतरित किया जाता है। नोट - इस सूची को एक अमेरिकी मशीन पर संकलित किया गया था। मुझे नहीं पता कि अन्य भाषाओं का इस सूची पर क्या प्रभाव पड़ सकता है।
158 treated as 080 199 treated as 221 226 treated as 071
169 treated as 170 200 treated as 043 227 treated as 112
176 treated as 221 201 treated as 043 228 treated as 083
177 treated as 221 202 treated as 045 229 treated as 115
178 treated as 221 203 treated as 045 231 treated as 116
179 treated as 221 204 treated as 221 232 treated as 070
180 treated as 221 205 treated as 045 233 treated as 084
181 treated as 221 206 treated as 043 234 treated as 079
182 treated as 221 207 treated as 045 235 treated as 100
183 treated as 043 208 treated as 045 236 treated as 056
184 treated as 043 209 treated as 045 237 treated as 102
185 treated as 221 210 treated as 045 238 treated as 101
186 treated as 221 211 treated as 043 239 treated as 110
187 treated as 043 212 treated as 043 240 treated as 061
188 treated as 043 213 treated as 043 242 treated as 061
189 treated as 043 214 treated as 043 243 treated as 061
190 treated as 043 215 treated as 043 244 treated as 040
191 treated as 043 216 treated as 043 245 treated as 041
192 treated as 043 217 treated as 043 247 treated as 126
193 treated as 045 218 treated as 043 249 treated as 250
194 treated as 045 219 treated as 221 251 treated as 118
195 treated as 043 220 treated as 095 252 treated as 110
196 treated as 045 222 treated as 221 254 treated as 221
197 treated as 043 223 treated as 095
198 treated as 221 224 treated as 097
किसी भी वर्ण> 0 से ऊपर की सूची में नहीं है, खुद को भी शामिल माना जाता है, <CR>
और < LF>
। विषम वर्णों को शामिल करने का सबसे आसान तरीका है <CR>
और <LF>
उन्हें एक पर्यावरण चर में लाना और कमांड लाइन तर्क के भीतर विलंबित विस्तार का उपयोग करना है।
/ G: FILE और / F: फ़ाइल विकल्प में निर्दिष्ट स्ट्रिंग्स के लिए वर्ण सीमाएँ
। फ़ाइल में nul (0x00) वर्ण दिखाई दे सकते हैं, लेकिन यह C स्ट्रिंग टर्मिनेटर की तरह कार्य करता है। शून्य वर्ण के बाद के किसी भी वर्ण को एक अलग तार के रूप में माना जाता है जैसे कि वे दूसरी पंक्ति में थे।
<CR>
और <LF>
वर्ण लाइन टर्मिनेटर्स कि एक स्ट्रिंग समाप्त, और स्ट्रिंग में शामिल नहीं हैं माना जाता है।
अन्य सभी एकल बाइट वर्णों को एक स्ट्रिंग में पूरी तरह से शामिल किया गया है।
यूनिकोड फ़ाइलों को खोजना
FINDSTR अधिकांश यूनिकोड (UTF-16, UTF-16LE, UTF-16BE, UTF-32) को ठीक से नहीं खोज सकता है क्योंकि यह nul बाइट्स की खोज नहीं कर सकता है और यूनिकोड में आमतौर पर कई nultes होते हैं।
हालाँकि, TYPE कमांड UTF-16LE को BOM के साथ एकल बाइट कैरेक्टर सेट में परिवर्तित करता है, इसलिए निम्न की तरह एक कमांड, BOM के साथ UTF-16LE के साथ काम करेगा।
type unicode.txt|findstr "search"
ध्यान दें कि यूनिकोड कोड बिंदु जो आपके सक्रिय कोड पृष्ठ द्वारा समर्थित नहीं हैं, उन्हें ?
वर्णों में बदल दिया जाएगा ।
जब तक आपके खोज स्ट्रिंग में केवल ASCII है, तब तक UTF-8 को खोजना संभव है। हालाँकि, किसी भी मल्टी-बाइट UTF-8 वर्ण का कंसोल आउटपुट सही नहीं होगा। लेकिन अगर आप आउटपुट को किसी फ़ाइल पर रीडायरेक्ट करते हैं, तो परिणाम सही ढंग से UTF-8 एनकोडेड होगा। ध्यान दें कि यदि UTF-8 फ़ाइल में BOM है, तो BOM को पहली पंक्ति का एक भाग माना जाएगा, जो एक खोज को फेंक सकता है जो एक पंक्ति की शुरुआत से मेल खाती है।
यदि आप अपना खोज स्ट्रिंग किसी UTF-8 एन्कोडेड खोज फ़ाइल (BOM के बिना) में रखते हैं, और / G विकल्प का उपयोग करते हैं, तो मल्टी-बाइट UTF-8 वर्णों को खोजना संभव है।
लाइन का अंत
FINDSTR हर <LF> के तुरंत बाद लाइनों को तोड़ देता है। लाइन टूटने पर <CR> की उपस्थिति या अनुपस्थिति का कोई प्रभाव नहीं पड़ता है।
अपेक्षा के अनुसार लाइन ब्रेक करना , .
रेगेक्स मेटाचैकर <CR> या <LF> से मेल नहीं खाएगा। लेकिन कमांड लाइन सर्च स्ट्रिंग का उपयोग करके लाइन ब्रेक को खोजना संभव है। दोनों <CR> और <LF> वर्णों को स्पष्ट रूप से मिलान किया जाना चाहिए। यदि एक बहु-पंक्ति मैच पाया जाता है, तो मैच की केवल 1 पंक्ति मुद्रित होती है। FINDSTR तब स्रोत में दूसरी पंक्ति में वापस दोगुना हो जाता है और फिर से खोज शुरू करता है - एक "आगे देखो" प्रकार की सुविधा।
TEXT.TXT मान लें कि ये सामग्री (यूनिक्स या विंडोज शैली हो सकती है)
A
A
A
B
A
A
फिर यह स्क्रिप्ट
@echo off
setlocal
::Define LF variable containing a linefeed (0x0A)
set LF=^
::Above 2 blank lines are critical - do not remove
::Define CR variable containing a carriage return (0x0D)
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
setlocal enableDelayedExpansion
::regex "!CR!*!LF!" will match both Unix and Windows style End-Of-Line
findstr /n /r /c:"A!CR!*!LF!A" TEST.TXT
ये परिणाम देता है
1:A
2:A
5:A
/ G: FILE विकल्प का उपयोग करके लाइन ब्रेक के पार खोजना असंभव है क्योंकि <CR> या <LF> का मिलान करने का एकमात्र तरीका एक रेगीक्स वर्ण श्रेणी श्रेणी अभिव्यक्ति है जो EOL वर्णों को सैंडविच करता है।
[<TAB>-<0x0B>]
<LF> से मेल खाता है, लेकिन यह <TAB> और <0x0B> से भी मेल खाता है
[<0x0C>-!]
<CR> से मेल खाता है, लेकिन यह <0x0C> और से भी मेल खाता है!
नोट - ऊपर मैं रेगी बाइट स्ट्रीम का प्रतीकात्मक निरूपण कर रहा हूँ क्योंकि मैं वर्णिक रूप से वर्णों का प्रतिनिधित्व नहीं कर सकता।
उत्तर नीचे के भाग 2 में जारी है ...
grep
जो है बहुत अच्छी तरह से समझ और दस्तावेज :-) देखें stackoverflow.com/questions/2635740/... उदाहरण के लिए।