คำนำข้อมูล
ส่วนใหญ่ในคำตอบนี้ได้รับการรวบรวมจากการทดลองที่ทำงานบนเครื่อง Vista เว้นแต่จะระบุไว้อย่างชัดเจนเป็นอย่างอื่นฉันไม่ได้รับการยืนยันว่าข้อมูลนี้ใช้กับ Windows รุ่นอื่นหรือไม่
เอาท์พุท FINDSTR
เอกสารไม่เคยรบกวนการอธิบายเอาท์พุทของ FINDSTR มันแสดงถึงความจริงที่ว่ามีการพิมพ์บรรทัดที่ตรงกัน แต่ไม่มีอะไรเพิ่มเติม
รูปแบบของการจับคู่สายเอาท์พุทเป็นดังนี้:
ชื่อไฟล์: LINENUMBER: lineOffset: ข้อความ
ที่ไหน
fileName: = ชื่อของไฟล์ที่มีบรรทัดที่ตรงกัน ชื่อไฟล์จะไม่ถูกพิมพ์หากมีการร้องขออย่างชัดเจนสำหรับไฟล์เดียวหรือหากค้นหาการป้อนข้อมูล piped หรือการเปลี่ยนเส้นทางการป้อนข้อมูล เมื่อพิมพ์ชื่อไฟล์จะรวมข้อมูลเส้นทางใด ๆ ที่ให้ไว้เสมอ ข้อมูลเส้นทางเพิ่มเติมจะถูกเพิ่มหาก/S
มีการใช้ตัวเลือก เส้นทางที่พิมพ์จะสัมพันธ์กับเส้นทางที่ให้ไว้เสมอหรือสัมพันธ์กับไดเรกทอรีปัจจุบันหากไม่ได้ระบุไว้
หมายเหตุ - คำนำหน้าชื่อไฟล์ที่สามารถหลีกเลี่ยงได้เมื่อค้นหาไฟล์หลายไฟล์โดยใช้ที่ไม่ได้มาตรฐาน (และไม่ดีเอกสาร) สัญลักษณ์ และ<
>
กฎระเบียบที่แน่นอนสำหรับวิธีการเหล่านี้ทำงานสัญลักษณ์สามารถพบได้ที่นี่ สุดท้ายคุณก็สามารถดูที่นี้เป็นตัวอย่างของวิธีการที่สัญลักษณ์ที่ไม่ได้มาตรฐานทำงานกับ findstr
lineNumber: = หมายเลขบรรทัดของบรรทัดที่ตรงกันที่แสดงเป็นค่าทศนิยมโดยที่ 1 หมายถึงบรรทัดที่ 1 ของอินพุต พิมพ์เฉพาะในกรณี/N
ที่ระบุตัวเลือก
lineOffset: = ออฟเซตทศนิยมไบต์ของการเริ่มต้นของบรรทัดที่ตรงกันโดยมี 0 แทนอักขระ 1 ของบรรทัดที่ 1 พิมพ์เฉพาะในกรณี/O
ที่ระบุตัวเลือก นี่ไม่ใช่ออฟเซ็ตของการแข่งขันภายในเส้น มันคือจำนวนไบต์จากจุดเริ่มต้นของไฟล์ถึงจุดเริ่มต้นของบรรทัด
text = การแทนค่าไบนารีของบรรทัดที่ตรงกันรวมถึง <CR> และ / หรือ <LF> ไม่มีสิ่งใดเหลืออยู่จากเอาต์พุตไบนารีเช่นตัวอย่างนี้ที่ตรงกับทุกบรรทัดจะสร้างสำเนาไบนารีที่แน่นอนของไฟล์ต้นฉบับ
FINDSTR "^" FILE >FILE_COPY
ตัวเลือก / A ตั้งค่าสีของ fileName :, lineNumber :, และ lineOffset: output เท่านั้น ข้อความของบรรทัดที่ตรงกันจะถูกเอาต์พุตด้วยสีคอนโซลปัจจุบันเสมอ ตัวเลือก / A มีผลเฉพาะเมื่อมีการแสดงผลเอาต์พุตโดยตรงไปยังคอนโซล ตัวเลือก / A ไม่มีผลใด ๆ หากผลลัพธ์ถูกเปลี่ยนเส้นทางไปยังไฟล์หรือ piped ดู2018-08-18 แก้ไขในคำตอบของ Aaciniสำหรับคำอธิบายเกี่ยวกับพฤติกรรมบั๊กกี้เมื่อเอาต์พุตถูกเปลี่ยนเส้นทางไปยัง CON
อักขระควบคุมส่วนใหญ่และอักขระ ASCII แบบขยายส่วนใหญ่แสดงเป็นจุดบน XP
FINDSTR บน XP แสดงอักขระควบคุมส่วนใหญ่ที่ไม่สามารถพิมพ์ได้จากบรรทัดที่ตรงกันเป็นจุด (จุด) บนหน้าจอ อักขระควบคุมต่อไปนี้เป็นข้อยกเว้น พวกเขาแสดงเป็นตัวเอง: แท็บ 0x09, 0x0A LineFeed, แท็บแนวตั้ง 0x0B, ฟีดฟอร์ม 0x0C, 0x0D Carriage Return
XP FINDSTR ยังแปลงอักขระ ASCII เพิ่มเติมจำนวนหนึ่งให้เป็นจุดเช่นกัน อักขระ ASCII แบบขยายที่แสดงเป็นจุดบน XP จะเหมือนกับอักขระที่ถูกแปลงเมื่อมีให้ในบรรทัดคำสั่ง ดูส่วน"ข้อ จำกัด อักขระสำหรับพารามิเตอร์บรรทัดคำสั่ง - การแปลง ASCII เพิ่มเติม"ในภายหลังในบทความนี้
อักขระควบคุมและ ASCII ที่ขยายเพิ่มจะไม่ถูกแปลงเป็นจุดบน XP หากเอาต์พุตถูกไพพ์, เปลี่ยนเส้นทางไปยังไฟล์หรือภายในข้อ FOR IN ()
Vista และ Windows 7 จะแสดงตัวละครทุกตัวเสมอไม่เป็นจุด
รหัสส่งคืน (ERRORLEVEL)
- 0 (สำเร็จ)
- พบข้อมูลที่ตรงกันในอย่างน้อยหนึ่งบรรทัดอย่างน้อยหนึ่งไฟล์
- 1 (ล้มเหลว)
- ไม่พบข้อมูลที่ตรงกันในไฟล์ใด ๆ
- ระบุสีไม่ถูกต้องตาม
/A:xx
ตัวเลือก
- 2 (ข้อผิดพลาด)
- ตัวเลือกที่เข้ากันไม่ได้
/L
และ/R
ทั้งสองระบุไว้
- ไม่มีอาร์กิวเมนต์หลัง
/A:
, /F:
, /C:
, /D:
หรือ/G:
- ไฟล์ที่ระบุโดย
/F:file
หรือ/G:file
ไม่พบ
- 255 (ข้อผิดพลาด)
แหล่งข้อมูลที่จะค้นหา (อัปเดตตามการทดสอบกับ Windows 7)
Findstr สามารถค้นหาข้อมูลจากแหล่งใดแหล่งหนึ่งต่อไปนี้:
ชื่อไฟล์ที่ระบุเป็นอาร์กิวเมนต์และ / หรือใช้/F:file
ตัวเลือก
stdin ผ่านการเปลี่ยนเส้นทาง findstr "searchString" <file
สตรีมข้อมูลจากไปป์ type file | findstr "searchString"
อาร์กิวเมนต์ / ตัวเลือกมีความสำคัญเหนือกว่าการเปลี่ยนเส้นทางซึ่งจะมีความสำคัญเหนือกว่าข้อมูลที่ถูกวางท่อ
อาร์กิวเมนต์ชื่อไฟล์และ/F:file
อาจรวมกัน อาจใช้อาร์กิวเมนต์ชื่อไฟล์หลายรายการ หาก/F:file
ระบุหลายตัวเลือกจะใช้ตัวเลือกสุดท้ายเท่านั้น อนุญาตให้ใช้ไวลด์การ์ดในการโต้แย้งชื่อไฟล์ แต่ไม่สามารถอยู่ในไฟล์ที่ระบุ/F:file
ได้
แหล่งที่มาของสตริงการค้นหา (Updated จากการทดสอบกับ Windows 7)และตัวเลือกอาจจะรวม อาจระบุหลายตัวเลือก หากระบุหลายตัวเลือกจะใช้ตัวเลือกสุดท้ายเท่านั้น หากทั้งสองหรือถูกใช้แล้วทุกข้อโต้แย้งที่ไม่ใช่ตัวเลือกจะถือว่าเป็นไฟล์ที่จะค้นหา หากค่ามิได้ถูกนำมาใช้แล้วอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือกแรกที่จะถือว่าเป็นพื้นที่ที่คั่นรายการคำค้นหา
/G:file
/C:string
/C:string
/G:file
/G:file
/C:string
/G:file
/C:string
ชื่อไฟล์จะต้องไม่ถูกยกมาภายในไฟล์เมื่อใช้/F:FILE
ตัวเลือก
ชื่อไฟล์อาจมีช่องว่างและอักขระพิเศษอื่น ๆ คำสั่งส่วนใหญ่ต้องการให้อ้างชื่อไฟล์ดังกล่าว แต่/F:files.txt
ตัวเลือกFINDSTR จะต้องไม่ระบุชื่อไฟล์ใน files.txt ไฟล์จะไม่ถูกค้นพบถ้าชื่อถูกยกมา
BUG - ชื่อไฟล์ย่อ 8.3 สามารถแบ่ง/D
และ/S
ตัวเลือก
เช่นเดียวกับคำสั่ง Windows ทั้งหมด FINDSTR จะพยายามจับคู่ทั้งชื่อยาวและชื่อ 8.3 สั้นเมื่อค้นหาไฟล์ที่จะค้นหา สมมติว่าโฟลเดอร์ปัจจุบันมีไฟล์ที่ไม่ว่างเปล่าดังต่อไปนี้:
b1.txt
b.txt2
c.txt
คำสั่งต่อไปนี้จะค้นหาไฟล์ทั้ง 3 ไฟล์ได้สำเร็จ:
findstr /m "^" *.txt
b.txt2
จับคู่เนื่องจากชื่อย่อB9F64~1.TXT
ตรงกันตรงกัน สิ่งนี้สอดคล้องกับพฤติกรรมของคำสั่ง Windows อื่น ๆ ทั้งหมด
แต่ข้อผิดพลาดที่มี/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, Vista และ Windows 7
อักขระที่ไม่สามารถพิมพ์ได้และ/P
ตัวเลือกตัวเลือก
นี้/P
ทำให้ FINDSTR ข้ามไฟล์ใด ๆ ที่มีรหัสไบต์ทศนิยมต่อไปนี้:
0-7, 14-25, 27-31
อีกวิธีหนึ่ง/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
ตัวเลือกทำให้ข้ามไฟล์
การป้อนข้อมูล Piped และ Redirected อาจ<CR><LF>
ต่อท้าย
หากมีการป้อนข้อมูลไปป์<LF>
ไลน์และอักขระตัวสุดท้ายของกระแสไม่ได้FINDSTR จะผนวก<CR><LF>
เข้ากับอินพุตโดยอัตโนมัติ สิ่งนี้ได้รับการยืนยันใน XP, Vista และ Windows 7 (ฉันเคยคิดว่าไพพ์ของ Windows มีหน้าที่ในการปรับเปลี่ยนอินพุต แต่ตั้งแต่ฉันค้นพบว่า FINDSTR กำลังทำการแก้ไขจริง)
เช่นเดียวกับการป้อนข้อมูลที่เปลี่ยนเส้นทางบน Vista หากอักขระตัวสุดท้ายของไฟล์ที่ใช้เป็นอินพุตที่ถูกเปลี่ยนเส้นทางไม่ได้<LF>
FINDSTR จะผนวก<CR><LF>
เข้ากับอินพุตโดยอัตโนมัติ อย่างไรก็ตาม XP และ Windows 7 จะไม่เปลี่ยนอินพุตที่เปลี่ยนเส้นทาง
FINDSTR แฮงค์บน XP และ Windows 7 หากอินพุตที่เปลี่ยนเส้นทางไม่ได้จบด้วย<LF>
นี่คือ "คุณสมบัติ" ที่น่ารังเกียจใน XP และ Windows 7 หากอักขระตัวสุดท้ายของไฟล์ที่ใช้เป็นอินพุตที่เปลี่ยนเส้นทางไม่ได้จบลงด้วย<LF>
FINDSTR จะหยุดทำงานทันที ถึงจุดสิ้นสุดของไฟล์ที่ถูกเปลี่ยนเส้นทาง
บรรทัดสุดท้ายของข้อมูล Piped อาจถูกละเว้นหากประกอบด้วยอักขระเดียว
หากอินพุตถูก<LF>
ไพพ์และบรรทัดสุดท้ายประกอบด้วยอักขระเดียวที่ไม่ได้ตามด้วยดังนั้น FINDSTR จะละเว้นบรรทัดสุดท้ายอย่างสมบูรณ์
ตัวอย่าง - คำสั่งแรกที่มีอักขระเดียวและไม่มีความ<LF>
ล้มเหลวในการจับคู่ แต่คำสั่งที่สองที่มี 2 ตัวอักษรทำงานได้ดีเช่นเดียวกับคำสั่งที่สามที่มีหนึ่งอักขระที่มีการยกเลิกการขึ้นบรรทัดใหม่
> set /p "=x" <nul | findstr "^"
> set /p "=xx" <nul | findstr "^"
xx
> echo x| findstr "^"
x
รายงานโดยใช้ฟองน้ำ DosTips ท้องในข้อผิดพลาด findstr ใหม่ ยืนยันใน XP, Windows 7 และ Windows 8 ยังไม่เคยได้ยินเกี่ยวกับ Vista (ฉันไม่มี Vista ที่จะทดสอบอีกต่อไป)
ตัวเลือกไวยากรณ์
ตัวเลือกที่สามารถนำหน้าด้วยอย่างใดอย่างหนึ่ง/
หรือ-
ตัวเลือกอาจจะถูกตัดแบ่งหลังเดียวหรือ/
-
อย่างไรก็ตามรายการตัวเลือกที่ต่อกันอาจมีตัวเลือกหลายตัวเลือกได้ไม่เกินหนึ่งตัวเช่น OFF หรือ F: และตัวเลือกหลายตัวจะต้องเป็นตัวเลือกสุดท้ายในรายการ
ต่อไปนี้เป็นวิธีที่เทียบเท่าทั้งหมดในการแสดงการค้นหา regex ที่ไม่สนใจขนาดตัวพิมพ์สำหรับบรรทัดใด ๆ ที่มีทั้ง "hello" และ "goodbye" ในลำดับใด ๆ
/i /r /c:"hello.*goodbye" /c:"goodbye.*hello"
-i -r -c:"hello.*goodbye" /c:"goodbye.*hello"
/irc:"hello.*goodbye" /c:"goodbye.*hello"
ขีดจำกัดความยาวของสตริงการค้นหา
ใน Vista ความยาวสูงสุดที่อนุญาตสำหรับสตริงการค้นหาเดียวคือ 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 ความยาวสตริงการค้นหานั้นสั้นลงอย่างเห็นได้ชัด ข้อผิดพลาด Findstr: "ค้นหาสตริงยาวเกินไป": วิธีแยกและจับคู่สตริงย่อยใน "สำหรับ" วนซ้ำ
ขีด จำกัด XP คือ 127 ไบต์สำหรับการค้นหาทั้งตัวอักษรและ regex
ขีดจำกัดความยาวบรรทัด
ไฟล์ที่ระบุเป็นอาร์กิวเมนต์บรรทัดคำสั่งหรือผ่านตัวเลือก / F: FILE ไม่มีขีดจำกัดความยาวบรรทัดที่ทราบ การค้นหาถูกเรียกใช้กับไฟล์ 128MB ที่ไม่มี <LF> เดียว
ข้อมูลที่ถูกวางท่อและอินพุตที่ถูกเปลี่ยนเส้นทางถูก จำกัด ที่ 8191 ไบต์ต่อบรรทัด ขีด จำกัด นี้เป็น "คุณสมบัติ" ของ FINDSTR ไม่ได้มีอยู่ในไพพ์หรือการเปลี่ยนเส้นทาง FINDSTR โดยใช้ stdin ที่ถูกเปลี่ยนเส้นทางหรืออินพุต piped จะไม่ตรงกับบรรทัดใด ๆ ที่> = 8k ไบต์ Lines> = 8k สร้างข้อความแสดงข้อผิดพลาดถึง stderr แต่ ERRORLEVEL ยังคงเป็น 0 หากพบสตริงการค้นหาในอย่างน้อยหนึ่งบรรทัดที่มีอย่างน้อยหนึ่งไฟล์
ประเภทการค้นหาเริ่มต้น: ตัวอักษรเทียบกับนิพจน์ปกติ
/C:"string"
- ค่าเริ่มต้นคือ / L ตัวอักษร การรวมตัวเลือก / L อย่างชัดเจนกับ / C: "string" ใช้งานได้อย่างแน่นอน แต่ซ้ำซ้อน
"string argument"
- ค่าเริ่มต้นขึ้นอยู่กับเนื้อหาของสตริงการค้นหาแรก (โปรดจำไว้ว่า <space> ใช้เพื่อกำหนดขอบเขตของสตริงการค้นหา)หากสตริงการค้นหาแรกเป็นนิพจน์ทั่วไปที่ถูกต้องซึ่งมีเมตาอักขระอย่างน้อยหนึ่งตัวที่ไม่ได้ใช้ Escape สตริงการค้นหาทั้งหมดจะถือว่าเป็นนิพจน์ทั่วไป มิฉะนั้นสตริงการค้นหาทั้งหมดจะถือว่าเป็นตัวอักษร ตัวอย่างเช่น"51.4 200"
จะถือว่าเป็นนิพจน์ทั่วไปสองรายการเนื่องจากสตริงแรกมีจุดที่ไม่ได้ Escape ขณะที่"200 51.4"
จะถือว่าเป็นสองตัวอักษรเนื่องจากสตริงแรกไม่มีอักขระเมตาใด ๆ
/G:file
- ค่าเริ่มต้นขึ้นอยู่กับเนื้อหาของบรรทัดแรกที่ไม่ว่างในไฟล์ หากสตริงการค้นหาแรกเป็นนิพจน์ทั่วไปที่ถูกต้องที่มีอย่างน้อยหนึ่งตัวอักษรเมตาไม่รอดหนีจากนั้นสตริงการค้นหาทั้งหมดจะถือว่าเป็นนิพจน์ปกติ มิฉะนั้นสตริงการค้นหาทั้งหมดจะถือว่าเป็นตัวอักษร
คำแนะนำ - เสมอชัดเจนระบุ/L
ตัวเลือกตัวอักษรหรือ/R
ตัวเลือกการแสดงผลปกติเมื่อใช้หรือ"string argument"
/G:file
BUG - การระบุสตริงการค้นหาตัวอักษรหลายตัวสามารถให้ผลลัพธ์ที่ไม่น่าเชื่อถือ
ตัวอย่าง FINDSTR ง่าย ๆ ต่อไปนี้ล้มเหลวในการค้นหาคู่ที่ตรงกันแม้ว่าควร
echo ffffaaa|findstr /l "ffffaaa faffaffddd"
ข้อผิดพลาดนี้ได้รับการยืนยันใน Windows Server 2003, Windows XP, Vista และ Windows 7
จากการทดลอง FINDSTR อาจล้มเหลวหากตรงตามเงื่อนไขต่อไปนี้ทั้งหมด:
- การค้นหาใช้สตริงการค้นหาตัวอักษรหลายรายการ
- สตริงการค้นหามีความยาวต่างกัน
- สตริงการค้นหาแบบสั้นมีการทับซ้อนจำนวนหนึ่งกับสตริงการค้นหาที่ยาวกว่า
- การค้นหาเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (ไม่มี
/I
ตัวเลือก)
ในความล้มเหลวทุกครั้งที่ฉันเห็นมันเป็นหนึ่งในสตริงการค้นหาที่สั้นกว่าที่ล้มเหลว
สำหรับข้อมูลเพิ่มเติมดูเหตุใดจึงไม่ตัวอย่าง FINDSTR ที่มีสตริงการค้นหาตามตัวอักษรหลายตัวค้นหาการจับคู่
เครื่องหมายคำพูดและแบ็คลาห์ภายในอาร์กิวเมนต์บรรทัดคำสั่ง
หมายเหตุ - ความคิดเห็นของผู้ใช้ MC ND สะท้อนให้เห็นถึงกฎที่ซับซ้อนอย่างน่ากลัวสำหรับส่วนนี้ มี 3 ขั้นตอนในการแยกวิเคราะห์ที่แตกต่างกันที่เกี่ยวข้อง:
- cmd.exe แรกอาจต้องใช้เครื่องหมายคำพูดเพื่อหนีเป็น ^ "(ไม่มีส่วนเกี่ยวข้องกับ FINDSTR)
- ถัดไป FINDSTR ใช้ตัวแยกวิเคราะห์อาร์กิวเมนต์ C / C ++ 2008 ก่อนซึ่งมีกฎพิเศษสำหรับ "และ \
- หลังจากตัวแยกวิเคราะห์อาร์กิวเมนต์เสร็จสิ้นแล้ว FINDSTR จะปฏิบัติต่อ \ ตามด้วยอักขระตัวอักษรและตัวเลขเป็นตัวอักษร แต่ \ ตามด้วยอักขระที่ไม่ใช่ตัวเลขและตัวอักษรเป็นอักขระยกเว้น
ส่วนที่เหลือของส่วนที่ไฮไลต์นี้ไม่ถูกต้อง 100% มันสามารถใช้เป็นแนวทางสำหรับสถานการณ์ต่าง ๆ แต่กฎข้างต้นจำเป็นสำหรับการทำความเข้าใจทั้งหมด
หนีอ้างภายในค้นหาบรรทัดคำสั่งสตริง
คำคมภายในสตริงการค้นหาบรรทัดคำสั่งจะต้องหนีด้วย backslash
\"
เช่น สิ่งนี้เป็นจริงสำหรับสตริงการค้นหาทั้งตัวอักษรและ regex ข้อมูลนี้ได้รับการยืนยันใน XP, Vista และ Windows 7
หมายเหตุ: อาจต้องใช้เครื่องหมายคำพูดเพื่อหลีกเลี่ยงการแยกวิเคราะห์ CMD.EXE แต่สิ่งนี้ไม่เกี่ยวกับ FINDSTR ตัวอย่างเช่นในการค้นหาคำพูดเดียวคุณสามารถใช้:
FINDSTR \^" file && echo found || echo not found
หนีทับขวาภายในบรรทัดคำสั่งค้นหาตัวอักษรสตริง
ทับขวาในสตริงการค้นหาตัวอักษรสามารถปกติจะแสดงเป็น
หรือเป็น\
\\
พวกเขามักจะเทียบเท่า (อาจมีกรณีที่ผิดปกติใน Vista ที่ทับขวาจะต้องหนีออกมา แต่ผมไม่ได้มีเครื่อง Vista เพื่อทดสอบ)
แต่มีบางกรณีพิเศษ:
เมื่อค้นหาเครื่องหมายแบ็กสแลชต่อเนื่องทั้งหมดจะต้องรอด แบ็กสแลชสุดท้ายอาจถูกเลือกให้เลือก
\\
สามารถเขียนโค้ดเป็น\\\
หรือ\\\\
\\\
สามารถเขียนโค้ดเป็น\\\\\
หรือ\\\\\\
ค้นหาเครื่องหมายแบ็กสแลชหนึ่งรายการหรือมากกว่าก่อนที่คำพูดจะแปลกประหลาด ลอจิกจะแนะนำว่าต้องอ้างคำพูดให้พ้นและเครื่องหมายแบ็กสแลชชั้นนำแต่ละอันจะต้องได้รับการหลบหนี แต่สิ่งนี้ไม่ได้ผล! แต่แบ็กสแลชที่นำหน้าแต่ละครั้งจะต้องได้รับการยกเว้นสองครั้งและเครื่องหมายคำพูดจะถูกยกเว้นตามปกติ:
\"
จะต้องมีรหัสเป็น \\\\\"
\\"
จะต้องมีรหัสเป็น \\\\\\\\\"
ตามที่ระบุไว้ก่อนหน้านี้หนึ่งคำพูดหรือมากกว่านั้นอาจต้องมีการหลบหนีด้วย^
สำหรับตัวแยกวิเคราะห์ CMD
ข้อมูลในส่วนนี้ได้รับการยืนยันใน XP และ Windows 7
การหลบหลีก Backslash ภายในสตริงคำสั่งการค้นหา regex
Vista เท่านั้น:แบ็กสแลชใน regex จะต้องมีการหลบหนีสองครั้งเช่นเดียว\\\\
หรืออื่น ๆ ที่หลบหนีภายในชุดชั้นตัวละครเช่น
[\\]
XP และ Windows 7:ทับขวาใน regex [\\]
เสมอสามารถแสดงเป็น \\
มันสามารถปกติจะแสดงเป็น แต่สิ่งนี้จะไม่ทำงานหากแบ็กสแลชนำหน้าคำพูดที่หลบหนี
แบ็กสแลชหนึ่งรายการหรือมากกว่าก่อนที่จะอ้างคำพูดที่ต้องหลีกเลี่ยงต้องมีการหลบหนีอย่างใดอย่างหนึ่งหรือรหัสอื่นเป็น [\\]
\"
อาจมีรหัสเป็น\\\\\"
หรือ[\\]\"
\\"
อาจมีรหัสเป็น\\\\\\\\\"
หรือ[\\][\\]\"
หรือ\\[\\]\"
การ
หลีกเลี่ยงการอ้างและแบ็กสแลชภายใน / G: สตริงการค้นหาตัวอักษรคำพูดแบบสแตนด์อโลนและแบ็กสแลชภายในไฟล์สตริงการค้นหาตัวอักษรที่ระบุโดยไฟล์ / G: ไม่จำเป็นต้องหลบหนี แต่สามารถเป็นได้
"
และ\"
เทียบเท่า
\
และ\\
เทียบเท่า
หากเจตนาคือการหา \\ อย่างน้อยต้องมีเครื่องหมายแบคสแลชนำหน้า ทั้งงาน\\\
และ\\\\
หากเจตนาคือการหา \ "อย่างน้อยแบ็กสแลชชั้นนำจะต้องถูกหลบหนีทั้งคู่\\"
และ\\\"
ทำงาน
Escaping Quote และ Backslash ภายใน / G: FILE regex สตริงการค้นหา
นี่เป็นกรณีหนึ่งที่ escape sequences ทำงานตามที่คาดไว้ตามเอกสาร การอ้างอิงไม่ใช่ตัวบ่งชี้ regex ดังนั้นจึงไม่จำเป็นต้องหลีกเลี่ยง (แต่อาจเป็นได้) Backslash เป็นตัวบ่งชี้ regex ดังนั้นจะต้องมีการหลบหนี
ข้อ จำกัด อักขระสำหรับพารามิเตอร์บรรทัดคำสั่ง - การแปลง ASCII แบบขยายอักขระ
null (0x00) ไม่สามารถปรากฏในสตริงใด ๆ ในบรรทัดคำสั่ง อักขระไบต์เดียวอื่น ๆ สามารถปรากฏในสตริง (0x01 - 0xFF) อย่างไรก็ตาม FINDSTR แปลงอักขระ ASCII แบบขยายจำนวนมากที่พบภายในพารามิเตอร์บรรทัดคำสั่งเป็นอักขระอื่น สิ่งนี้มีผลกระทบที่สำคัญในสองวิธี:
1) อักขระ ASCII แบบขยายจำนวนมากจะไม่ตรงกันถ้าใช้เป็นสตริงการค้นหาในบรรทัดคำสั่ง ข้อ จำกัด นี้จะเหมือนกันสำหรับการค้นหาตามตัวอักษรและ regex หากสตริงการค้นหาต้องมี 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: FILE
อักขระ nul (0x00) สามารถปรากฏในไฟล์ได้ แต่จะทำหน้าที่คล้ายกับสตริงสตริง C อักขระใด ๆ ที่อยู่หลังอักขระ nul จะถือว่าเป็นสตริงที่แตกต่างราวกับว่าอยู่ในบรรทัดอื่น
<CR>
และ<LF>
ตัวอักษรจะถือว่าเป็นจุดสิ้นสุดบรรทัดที่ยุติสตริงและจะไม่รวมอยู่ในสตริง
อักขระไบต์เดียวอื่น ๆ ทั้งหมดรวมอยู่ในสตริงอย่างสมบูรณ์
การค้นหาไฟล์ Unicode
FINDSTR ไม่สามารถค้นหา Unicode ส่วนใหญ่ (UTF-16, UTF-16LE, UTF-16BE, UTF-32) ได้อย่างถูกต้องเพราะมันไม่สามารถค้นหา nul bytes และ Unicode มักมีจำนวนไบต์ nul จำนวนมาก
อย่างไรก็ตามคำสั่ง TYPE แปลง UTF-16LE ด้วย BOM เป็นชุดอักขระไบต์เดียวดังนั้นคำสั่งเช่นนี้จะทำงานกับ UTF-16LE ด้วย BOM
type unicode.txt|findstr "search"
โปรดทราบว่าจุดโค้ด Unicode ที่ไม่ได้รับการสนับสนุนจากหน้ารหัสที่ใช้งานของคุณจะถูกแปลงเป็น?
อักขระ
สามารถค้นหา UTF-8 ได้ตราบใดที่สตริงการค้นหาของคุณมีเพียง ASCII อย่างไรก็ตามเอาต์พุตคอนโซลของอักขระหลายไบต์ UTF-8 ใด ๆ จะไม่ถูกต้อง แต่ถ้าคุณเปลี่ยนเส้นทางไปยังไฟล์ผลลัพธ์จะถูกเข้ารหัส UTF-8 อย่างถูกต้อง โปรดทราบว่าหากไฟล์ UTF-8 มี BOM ดังนั้น BOM จะถือเป็นส่วนหนึ่งของบรรทัดแรกซึ่งอาจทำให้การค้นหาที่ตรงกับจุดเริ่มต้นของบรรทัดตรงข้าม
เป็นไปได้ที่จะค้นหาอักขระหลายไบต์ UTF-8 หากคุณใส่สตริงการค้นหาในไฟล์ค้นหาที่เข้ารหัส UTF-8 (โดยไม่มี BOM) และใช้ตัวเลือก / G
จุดสิ้นสุดของบรรทัด
FINDSTR แบ่งบรรทัดทันทีทุก ๆ <LF> การมีหรือไม่มี <CR> จะไม่มีผลกระทบต่อการขึ้นบรรทัดใหม่
การค้นหาข้ามตัวแบ่งบรรทัด
ตามที่คาดไว้ตัว.
บ่งชี้ regex จะไม่ตรงกัน <CR> หรือ <LF> แต่เป็นไปได้ที่จะค้นหาข้ามตัวแบ่งบรรทัดโดยใช้สตริงการค้นหาบรรทัดคำสั่ง ทั้งอักขระ <CR> และ <LF> ต้องตรงกันอย่างชัดเจน หากพบการจับคู่หลายคู่สายจะมีการพิมพ์เฉพาะบรรทัดแรกของการจับคู่ FINDSTR จากนั้นกลับไปที่บรรทัดที่ 2 ในแหล่งที่มาและเริ่มการค้นหาอีกครั้ง - เรียงลำดับของคุณลักษณะประเภท "มองไปข้างหน้า"
สมมติว่า TEXT.TXT มีเนื้อหาเหล่านี้ (อาจเป็นรูปแบบ Unix หรือ Windows)
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> คือผ่านนิพจน์ช่วงคลาสอักขระ regex ที่คั่นอักขระ EOL
[<TAB>-<0x0B>]
จับคู่ <LF> แต่ตรงกับ <TAB> และ <0x0B>
[<0x0C>-!]
จับคู่ <CR> แต่ก็ตรงกับ <0x0C> และ!
หมายเหตุ - ด้านบนเป็นการแสดงสัญลักษณ์ของกระแสข้อมูล regex เนื่องจากฉันไม่สามารถแสดงอักขระได้
ตอบคำถามต่อในตอนที่ 2 ด้านล่าง ...
grep
ซึ่งเป็นที่เข้าใจและจัดทำเอกสารเป็นอย่างดี :-) ดูstackoverflow.com/questions/2635740/เป็นต้น