Lời nói đầu
Phần lớn thông tin trong câu trả lời này đã được thu thập dựa trên các thử nghiệm chạy trên máy Vista. Trừ khi có quy định rõ ràng khác, tôi chưa xác nhận liệu thông tin có áp dụng cho các phiên bản Windows khác hay không.
Đầu ra FINDSTR
Tài liệu không bao giờ làm phiền để giải thích đầu ra của FINDSTR. Nó ám chỉ thực tế là các dòng phù hợp được in, nhưng không có gì hơn.
Định dạng của đầu ra dòng phù hợp như sau:
tên tệp: lineNumber: line Offerset: text
Ở đâu
fileName: = Tên của tệp chứa dòng phù hợp. Tên tệp không được in nếu yêu cầu rõ ràng cho một tệp hoặc nếu tìm kiếm đầu vào có đường ống hoặc đầu vào được chuyển hướng. Khi được in, fileName sẽ luôn bao gồm bất kỳ thông tin đường dẫn nào được cung cấp. Thông tin đường dẫn bổ sung sẽ được thêm vào nếu/S
tùy chọn được sử dụng. Đường dẫn được in luôn liên quan đến đường dẫn được cung cấp hoặc liên quan đến thư mục hiện tại nếu không được cung cấp.
Lưu ý - Có thể tránh tiền tố tên tệp khi tìm kiếm nhiều tệp bằng cách sử dụng các ký tự đại diện không chuẩn (và tài liệu kém) <
và >
. Các quy tắc chính xác cho cách thức hoạt động của các ký tự đại diện ở đây . Cuối cùng, bạn có thể xem ví dụ này về cách các ký tự đại diện không chuẩn hoạt động với FINDSTR .
lineNumber: = Số dòng của dòng khớp được biểu thị dưới dạng giá trị thập phân với 1 đại diện cho dòng đầu tiên của đầu vào. Chỉ in nếu/N
tùy chọn được chỉ định.
linePackset: = Độ lệch byte thập phân của điểm bắt đầu của dòng khớp, với 0 đại diện cho ký tự đầu tiên của dòng thứ nhất. Chỉ in nếu/O
tùy chọn được chỉ định. Đây không phải làphần bù của trận đấu trong dòng. Đó là số byte từ đầu tệp đến đầu dòng.
text = Biểu diễn nhị phân của dòng khớp, bao gồm mọi <CR> và / hoặc <LF>. Không có gì bị bỏ sót ngoài đầu ra nhị phân, sao cho ví dụ này khớp với tất cả các dòng sẽ tạo ra một bản sao nhị phân chính xác của tệp gốc.
FINDSTR "^" FILE >FILE_COPY
Tùy chọn / A đặt màu của fileName:, lineNumber:, và line Offerset: chỉ xuất ra. Văn bản của dòng phù hợp luôn được xuất ra với màu bảng điều khiển hiện tại. Tùy chọn / A chỉ có hiệu lực khi đầu ra được hiển thị trực tiếp đến bàn điều khiển. Tùy chọn / A không có hiệu lực nếu đầu ra được chuyển hướng đến một tệp hoặc đường ống. Xem bản chỉnh sửa 2018-08-18 trong câu trả lời của Aacini để biết mô tả về hành vi lỗi khi đầu ra được chuyển hướng đến CON.
Hầu hết các ký tự điều khiển và nhiều ký tự ASCII mở rộng hiển thị dưới dạng dấu chấm trên XP
FINDSTR trên XP hiển thị hầu hết các ký tự điều khiển không in được từ các dòng khớp nhau dưới dạng dấu chấm (dấu chấm) trên màn hình. Các ký tự điều khiển sau đây là ngoại lệ; chúng tự hiển thị: Tab 0x09, 0x0A LineFeed, Tab dọc 0x0B, Nguồn cấp biểu mẫu 0x0C, Trả về vận chuyển 0x0D.
XP FINDSTR cũng chuyển đổi một số ký tự ASCII mở rộng thành dấu chấm. Các ký tự ASCII mở rộng hiển thị dưới dạng các chấm trên XP giống như các ký tự được chuyển đổi khi được cung cấp trên dòng lệnh. Xem phần "Giới hạn ký tự cho các tham số dòng lệnh - Chuyển đổi ASCII mở rộng" , ở phần sau của bài viết này
Các ký tự điều khiển và ASCII mở rộng không được chuyển đổi thành các dấu chấm trên XP nếu đầu ra được dẫn, chuyển hướng đến một tệp hoặc trong mệnh đề FOR IN ().
Vista và Windows 7 luôn hiển thị tất cả các ký tự như chính chúng, không bao giờ là dấu chấm.
Mã trả về (ERRORLEVEL)
- 0 (thành công)
- Trận đấu được tìm thấy trong ít nhất một dòng của ít nhất một tệp.
- 1 (thất bại)
- Không có kết quả khớp nào được tìm thấy trong bất kỳ dòng nào của tập tin.
- Màu không hợp lệ được chỉ định bởi
/A:xx
tùy chọn
- 2 (lỗi)
- Tùy chọn không tương thích
/L
và /R
cả hai chỉ định
- Thiếu đối số sau
/A:
, /F:
, /C:
, /D:
, hoặc/G:
- Tập tin được chỉ định bởi
/F:file
hoặc /G:file
không tìm thấy
- 255 (lỗi)
Nguồn dữ liệu để tìm kiếm (Được cập nhật dựa trên các thử nghiệm với Windows 7)
Findstr có thể tìm kiếm dữ liệu từ một trong các nguồn sau:
tên tệp được chỉ định làm đối số và / hoặc sử dụng /F:file
tùy chọn.
stdin thông qua chuyển hướng findstr "searchString" <file
luồng dữ liệu từ một đường ống type file | findstr "searchString"
Đối số / tùy chọn được ưu tiên hơn chuyển hướng, trong đó ưu tiên hơn dữ liệu đường ống.
Đối số tên tệp và /F:file
có thể được kết hợp. Nhiều đối số tên tệp có thể được sử dụng. Nếu nhiều /F:file
tùy chọn được chỉ định, thì chỉ có tùy chọn cuối cùng được sử dụng. Thẻ hoang dã được phép trong các đối số tên tệp, nhưng không nằm trong tệp được trỏ bởi /F:file
.
Nguồn của chuỗi tìm kiếm (Được cập nhật dựa trên các thử nghiệm với Windows 7)
Các tùy chọn /G:file
và /C:string
có thể được kết hợp. Nhiều /C:string
tùy chọn có thể được chỉ định. Nếu nhiều /G:file
tùy chọn được chỉ định, thì chỉ có tùy chọn cuối cùng được sử dụng. Nếu một trong hai /G:file
hoặc /C:string
được sử dụng, thì tất cả các đối số không phải tùy chọn được coi là tệp để tìm kiếm. Nếu không /G:file
cũng không /C:string
được sử dụng, sau đó lập luận phi tùy chọn đầu tiên được coi là một không gian giới hạn danh sách các thuật ngữ tìm kiếm.
Tên tệp không được trích dẫn trong tệp khi sử dụng /F:FILE
tùy chọn.
Tên tệp có thể chứa dấu cách và các ký tự đặc biệt khác. Hầu hết các lệnh yêu cầu tên tệp như vậy được trích dẫn. Nhưng /F:files.txt
tùy chọn FINDSTR yêu cầu tên tệp trong tệp.txt phải KHÔNG được trích dẫn. Các tập tin sẽ không được tìm thấy nếu tên được trích dẫn.
LGI - Tên tệp ngắn 8.3 có thể phá vỡ các tùy chọn /D
và/S
như với tất cả các lệnh Windows, FINDSTR sẽ cố gắng khớp cả tên dài và tên 8.3 ngắn khi tìm tệp để tìm kiếm. Giả sử thư mục hiện tại chứa các tệp không trống sau:
b1.txt
b.txt2
c.txt
Lệnh sau sẽ tìm thành công cả 3 tệp:
findstr /m "^" *.txt
b.txt2
phù hợp vì tên ngắn tương ứng B9F64~1.TXT
phù hợp. Điều này phù hợp với hành vi của tất cả các lệnh Windows khác.
Nhưng một lỗi với /D
và /S
các tùy chọn khiến các lệnh sau chỉ tìm thấyb1.txt
findstr /m /d:. "^" *.txt
findstr /m /s "^" *.txt
Lỗi này không b.txt2
được tìm thấy, cũng như tất cả các tên tệp sắp xếp sau b.txt2
trong cùng một thư mục. Các tập tin bổ sung sắp xếp trước, như a.txt
, được tìm thấy. Các tệp bổ sung sắp xếp sau này, như d.txt
, sẽ bị bỏ qua khi lỗi được kích hoạt.
Mỗi thư mục tìm kiếm được xử lý độc lập. Ví dụ: /S
tùy chọn sẽ bắt đầu tìm kiếm thành công trong thư mục con sau khi không tìm thấy tệp trong phần cha mẹ, nhưng một khi lỗi khiến tên tệp ngắn bị bỏ sót ở trẻ, thì tất cả các tệp tiếp theo trong thư mục con đó cũng sẽ bị bỏ qua .
Các lệnh hoạt động không có lỗi nếu các tên tệp giống nhau được tạo trên một máy bị tắt thế hệ tên NTFS 8.3. Tất nhiên b.txt2
sẽ không được tìm thấy, nhưng c.txt
sẽ được tìm thấy đúng.
Không phải tất cả các tên ngắn kích hoạt lỗi. Tất cả các trường hợp về hành vi bị lỗi mà tôi đã thấy liên quan đến một phần mở rộng dài hơn 3 ký tự với một tên ngắn 8.3 bắt đầu giống như một tên bình thường không yêu cầu tên 8.3.
Lỗi này đã được xác nhận trên XP, Vista và Windows 7.
Ký tự không thể in và /P
tùy chọn
Các /P
tùy chọn gây FINDSTR để bỏ qua bất kỳ tập tin có chứa bất kỳ số thập phân mã byte sau:
0-7, 14-25, 27-31.
Nói cách khác, /P
tùy chọn sẽ chỉ bỏ qua các tệp có chứa các ký tự điều khiển không in được. Ký tự điều khiển là các mã nhỏ hơn hoặc bằng 31 (0x1F). FINDSTR coi các ký tự điều khiển sau là có thể in được:
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)
Tất cả các ký tự điều khiển khác được coi là không thể in được, sự hiện diện của nó khiến /P
tùy chọn bỏ qua tệp.
Đầu vào đường ống và chuyển hướng có thể đã <CR><LF>
nối thêm
Nếu đầu vào được dẫn vào và ký tự cuối cùng của luồng không <LF>
, thì FINDSTR sẽ tự động nối <CR><LF>
vào đầu vào. Điều này đã được xác nhận trên XP, Vista và Windows 7. (Tôi từng nghĩ rằng ống Windows chịu trách nhiệm sửa đổi đầu vào, nhưng tôi đã phát hiện ra rằng FINDSTR thực sự đang thực hiện sửa đổi.)
Điều này cũng đúng với đầu vào được chuyển hướng trên Vista. Nếu ký tự cuối cùng của tệp được sử dụng làm đầu vào được chuyển hướng thì không <LF>
, FINDSTR sẽ tự động nối <CR><LF>
vào đầu vào. Tuy nhiên, XP và Windows 7 không thay đổi đầu vào chuyển hướng.
FINDSTR bị treo trên XP và Windows 7 nếu đầu vào được chuyển hướng không kết thúc bằng<LF>
Đây là một "tính năng" khó chịu trên XP và Windows 7. Nếu ký tự cuối cùng của tệp được sử dụng làm đầu vào chuyển hướng không kết thúc <LF>
, thì FINDSTR sẽ bị treo vô thời hạn một khi nó đến cuối tập tin chuyển hướng.
Dòng dữ liệu cuối cùng có thể bị bỏ qua nếu nó bao gồm một ký tự
Nếu đầu vào được đặt vào và dòng cuối cùng bao gồm một ký tự không được theo sau <LF>
, thì FINDSTR hoàn toàn bỏ qua dòng cuối cùng.
Ví dụ - Lệnh đầu tiên có một ký tự duy nhất và không <LF>
khớp, nhưng lệnh thứ hai có 2 ký tự hoạt động tốt, cũng như lệnh thứ ba có một ký tự kết thúc dòng mới.
> set /p "=x" <nul | findstr "^"
> set /p "=xx" <nul | findstr "^"
xx
> echo x| findstr "^"
x
Báo cáo bởi người dùng DosTips Sponge Belly tại lỗi findstr mới . Xác nhận trên XP, Windows 7 và Windows 8. Chưa nghe về Vista. (Tôi không còn có Vista để kiểm tra).
Cú pháp
tùy chọn Tùy chọn có thể được thêm tiền tố /
hoặc -
Tùy chọn có thể được nối sau một /
hoặc -
. Tuy nhiên, danh sách tùy chọn được nối có thể chứa tối đa một tùy chọn đa vi khuẩn như TẮT hoặc F:, và tùy chọn đa ký tự phải là tùy chọn cuối cùng trong danh sách.
Sau đây là tất cả các cách tương đương để diễn tả một trường hợp tìm kiếm regex không nhạy cảm cho bất kỳ dòng nào chứa cả "xin chào" và "tạm biệt" theo bất kỳ thứ tự nào
/i /r /c:"hello.*goodbye" /c:"goodbye.*hello"
-i -r -c:"hello.*goodbye" /c:"goodbye.*hello"
/irc:"hello.*goodbye" /c:"goodbye.*hello"
Giới hạn độ dài chuỗi tìm kiếm
Trên Vista, độ dài tối đa được phép cho một chuỗi tìm kiếm là 511 byte. Nếu bất kỳ chuỗi tìm kiếm nào vượt quá 511 thì kết quả là FINDSTR: Search string too long.
lỗi với ERRORLEVEL 2.
Khi thực hiện tìm kiếm biểu thức chính quy, độ dài chuỗi tìm kiếm tối đa là 254. Biểu thức chính quy có độ dài từ 255 đến 511 sẽ dẫn đến FINDSTR: Out of memory
lỗi với ERRORLEVEL 2. Độ dài biểu thức chính quy> 511 dẫn đến FINDSTR: Search string too long.
lỗi.
Trên Windows XP, độ dài chuỗi tìm kiếm rõ ràng ngắn hơn. Lỗi Findstr: "Chuỗi tìm kiếm quá dài": Làm cách nào để trích xuất và khớp chuỗi con trong vòng lặp "for"?
Giới hạn XP là 127 byte cho cả tìm kiếm theo nghĩa đen và regex.
Giới hạn độ dài dòng Các
tệp được chỉ định làm đối số dòng lệnh hoặc thông qua tùy chọn / F: FILE không có giới hạn độ dài dòng đã biết. Các tìm kiếm đã được chạy thành công đối với tệp 128 MB không chứa một <LF>.
Dữ liệu đường ống và đầu vào được chuyển hướng được giới hạn ở 8191 byte mỗi dòng. Giới hạn này là một "tính năng" của FINDSTR. Nó không phải là vốn có của đường ống hoặc chuyển hướng. TÌM KIẾM bằng cách sử dụng stdin chuyển hướng hoặc đầu vào đường ống sẽ không bao giờ khớp với bất kỳ dòng nào> = 8k byte. Các dòng> = 8k tạo thông báo lỗi tới stderr, nhưng ERRORLEVEL vẫn là 0 nếu chuỗi tìm kiếm được tìm thấy trong ít nhất một dòng của ít nhất một tệp.
Loại tìm kiếm
/C:"string"
mặc định: Chữ và biểu thức chính quy - Mặc định là / L bằng chữ. Hoàn toàn kết hợp tùy chọn / L với / C: "chuỗi" chắc chắn hoạt động nhưng không cần thiết.
"string argument"
- Mặc định phụ thuộc vào nội dung của chuỗi tìm kiếm đầu tiên. (Hãy nhớ rằng <dấu cách> được sử dụng để phân định các chuỗi tìm kiếm.) Nếu chuỗi tìm kiếm đầu tiên là một biểu thức chính quy hợp lệ có chứa ít nhất một ký tự meta không thoát, thì tất cả các chuỗi tìm kiếm được coi là biểu thức chính quy. Nếu không, tất cả các chuỗi tìm kiếm được coi là chữ. Ví dụ: "51.4 200"
sẽ được coi là hai biểu thức chính quy bởi vì chuỗi đầu tiên chứa một dấu chấm không thoát, trong khi đó "200 51.4"
sẽ được coi là hai chữ vì chuỗi đầu tiên không chứa bất kỳ ký tự meta nào.
/G:file
- Mặc định phụ thuộc vào nội dung của dòng không trống đầu tiên trong tệp. Nếu chuỗi tìm kiếm đầu tiên là một biểu thức chính quy hợp lệ có chứa ít nhất một ký tự meta chưa thoát, thì tất cả các chuỗi tìm kiếm được coi là biểu thức chính quy. Nếu không, tất cả các chuỗi tìm kiếm được coi là chữ.
Khuyến nghị - Luôn chỉ định rõ ràng /L
tùy chọn bằng chữ hoặc /R
tùy chọn biểu thức chính quy khi sử dụng "string argument"
hoặc /G:file
.
LGI - Chỉ định nhiều chuỗi tìm kiếm theo nghĩa đen có thể cho kết quả không đáng tin cậy
Ví dụ FINDSTR đơn giản sau đây không tìm thấy kết quả khớp, mặc dù vậy.
echo ffffaaa|findstr /l "ffffaaa faffaffddd"
Lỗi này đã được xác nhận trên Windows Server 2003, Windows XP, Vista và Windows 7.
Dựa trên các thử nghiệm, FINDSTR có thể thất bại nếu tất cả các điều kiện sau được đáp ứng:
- Tìm kiếm đang sử dụng nhiều chuỗi tìm kiếm theo nghĩa đen
- Các chuỗi tìm kiếm có độ dài khác nhau
- Chuỗi tìm kiếm ngắn có một số lượng trùng lặp với chuỗi tìm kiếm dài hơn
- Tìm kiếm là trường hợp nhạy cảm (không có
/I
tùy chọn)
Trong mọi thất bại tôi đã thấy, nó luôn là một trong những chuỗi tìm kiếm ngắn hơn thất bại.
Để biết thêm thông tin, hãy xem Tại sao ví dụ FINDSTR này không có nhiều chuỗi tìm kiếm theo nghĩa đen tìm thấy sự trùng khớp?
Báo giá và phản hồi trong các đối số dòng lệnh
Lưu ý - Nhận xét của người dùng MC ND phản ánh các quy tắc phức tạp khủng khiếp thực sự cho phần này. Có 3 giai đoạn phân tích cú pháp riêng biệt liên quan:
- Cmd.exe đầu tiên có thể yêu cầu một số trích dẫn được thoát là ^ "(thực sự không có gì để làm với FINDSTR)
- FINDSTR tiếp theo sử dụng trình phân tích cú pháp đối số MS C / C ++ trước 2008 , có các quy tắc đặc biệt cho "và \
- Sau khi trình phân tích cú pháp đối số kết thúc, FINDSTR còn xử lý thêm \ theo sau là một ký tự chữ và số dưới dạng chữ, nhưng \ theo sau là ký tự không phải là số-alpha dưới dạng ký tự thoát
Phần còn lại của phần được tô sáng này không chính xác 100%. Nó có thể phục vụ như một hướng dẫn cho nhiều tình huống, nhưng các quy tắc trên là cần thiết cho sự hiểu biết tổng thể.
Thoát trích dẫn trong chuỗi tìm kiếm dòng lệnh
Báo giá trong chuỗi tìm kiếm dòng lệnh phải được thoát với dấu gạch chéo ngược như thế nào
\"
. Điều này đúng cho cả chuỗi tìm kiếm theo nghĩa đen và regex. Thông tin này đã được xác nhận trên XP, Vista và Windows 7.
Lưu ý: Báo giá cũng có thể cần phải được thoát cho trình phân tích cú pháp CMD.EXE, nhưng điều này không liên quan gì đến FINDSTR. Ví dụ: để tìm kiếm một trích dẫn bạn có thể sử dụng:
FINDSTR \^" file && echo found || echo not found
Thoát khỏi dấu gạch chéo ngược trong chuỗi tìm kiếm bằng chữ dòng lệnh
Dấu gạch chéo ngược trong chuỗi tìm kiếm bằng chữ thường có thể được biểu diễn dưới dạng
\
hoặc dưới dạng \\
. Chúng thường tương đương. (Có thể có những trường hợp bất thường trong Vista khi dấu gạch chéo ngược phải luôn được thoát, nhưng tôi không còn máy Vista để kiểm tra nữa) .
Nhưng có một số trường hợp đặc biệt:
Khi tìm kiếm dấu gạch chéo ngược liên tiếp, tất cả ngoại trừ cuối cùng phải được thoát. Dấu gạch chéo ngược cuối cùng có thể được thoát.
\\
có thể được mã hóa thành \\\
hoặc\\\\
\\\
có thể được mã hóa thành \\\\\
hoặc\\\\\\
Tìm kiếm một hoặc nhiều dấu gạch chéo ngược trước khi trích dẫn là kỳ quái. Logic sẽ đề xuất rằng trích dẫn phải được thoát, và mỗi dấu gạch chéo ngược hàng đầu sẽ cần phải được thoát, nhưng điều này không hoạt động! Thay vào đó, mỗi dấu gạch chéo ngược hàng đầu phải được thoát hai lần và trích dẫn được thoát bình thường:
\"
phải được mã hóa là \\\\\"
\\"
phải được mã hóa là \\\\\\\\\"
Như đã lưu ý trước đó, một hoặc nhiều trích dẫn đã thoát cũng có thể yêu cầu thoát với ^
trình phân tích cú pháp CMD
Thông tin trong phần này đã được xác nhận trên XP và Windows 7.
Thoát Backslash trong chuỗi tìm kiếm regex dòng lệnh
Chỉ dành cho Vista: Dấu gạch chéo ngược trong regex phải được thoát gấp đôi như thế \\\\
hoặc nếu không thì thoát đơn lẻ trong một lớp ký tự như
[\\]
XP và Windows 7: Dấu gạch chéo ngược trong regex luôn có thể được biểu diễn dưới dạng [\\]
. Nó thường có thể được đại diện là \\
. Nhưng điều này không bao giờ hoạt động nếu dấu gạch chéo ngược trước một trích dẫn thoát.
Một hoặc nhiều dấu gạch chéo ngược trước khi trích dẫn thoát phải được thoát kép hoặc mã hóa khác là [\\]
\"
có thể được mã hóa thành \\\\\"
hoặc[\\]\"
\\"
có thể được mã hóa như \\\\\\\\\"
hoặc [\\][\\]\"
hoặc\\[\\]\"
Thoát trích dẫn và dấu gạch chéo ngược trong / G: FILE chuỗi tìm kiếm theo nghĩa đen
Dấu ngoặc kép độc lập và dấu gạch chéo ngược trong tệp chuỗi tìm kiếm bằng chữ được chỉ định bởi / G: tệp không cần phải thoát, nhưng chúng có thể được thoát.
"
và \"
là tương đương.
\
và \\
là tương đương.
Nếu mục đích là tìm kiếm \, thì ít nhất dấu gạch chéo ngược hàng đầu phải được thoát. Cả hai \\\
và \\\\
làm việc.
Nếu mục đích là tìm \ ", thì ít nhất dấu gạch chéo ngược hàng đầu phải được thoát. Cả hai \\"
và \\\"
công việc.
Thoát trích dẫn và dấu gạch chéo ngược trong / G: FILE chuỗi tìm kiếm regex
Đây là trường hợp trong đó các chuỗi thoát hoạt động như mong đợi dựa trên tài liệu. Trích dẫn không phải là một metacharacter regex, vì vậy nó không cần phải thoát (nhưng có thể). Backslash là một metacharacter regex, vì vậy nó phải được thoát.
Giới hạn ký tự cho các tham số dòng lệnh - Chuyển đổi ASCII mở rộng Ký tự
null (0x00) không thể xuất hiện trong bất kỳ chuỗi nào trên dòng lệnh. Bất kỳ ký tự byte đơn nào khác có thể xuất hiện trong chuỗi (0x01 - 0xFF). Tuy nhiên, FINDSTR chuyển đổi nhiều ký tự ASCII mở rộng mà nó tìm thấy trong các tham số dòng lệnh thành các ký tự khác. Điều này có tác động lớn theo hai cách:
1) Nhiều ký tự ASCII mở rộng sẽ không khớp với nhau nếu được sử dụng làm chuỗi tìm kiếm trên dòng lệnh. Giới hạn này là giống nhau cho các tìm kiếm theo nghĩa đen và regex. Nếu một chuỗi tìm kiếm phải chứa ASCII mở rộng, thì /G:FILE
tùy chọn nên được sử dụng thay thế.
2) FINDSTR có thể không tìm thấy tệp nếu tên chứa các ký tự ASCII mở rộng và tên tệp được chỉ định trên dòng lệnh. Nếu một tệp được tìm kiếm chứa ASCII mở rộng trong tên, thì /F:FILE
tùy chọn nên được sử dụng thay thế.
Dưới đây là danh sách đầy đủ các phép biến đổi ký tự ASCII mở rộng mà FINDSTR thực hiện trên các chuỗi dòng lệnh. Mỗi ký tự được biểu diễn dưới dạng giá trị mã byte thập phân. Mã đầu tiên đại diện cho ký tự như được cung cấp trên dòng lệnh và mã thứ hai đại diện cho ký tự mà nó được chuyển đổi thành. Lưu ý - danh sách này được tổng hợp trên máy Hoa Kỳ. Tôi không biết những tác động khác mà các ngôn ngữ khác có thể có trong danh sách này.
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
Bất kỳ ký tự> 0 nào không có trong danh sách trên đều được coi là chính nó, bao gồm <CR>
và < LF>
. Cách dễ nhất để bao gồm các ký tự lẻ như <CR>
và <LF>
đưa chúng vào một biến môi trường và sử dụng mở rộng bị trì hoãn trong đối số dòng lệnh.
Giới hạn ký tự cho các chuỗi được tìm thấy trong các tệp được chỉ định bởi / G: FILE và / F: FILE Tùy chọn
nul (0x00) có thể xuất hiện trong tệp, nhưng nó hoạt động như bộ kết thúc chuỗi C. Bất kỳ ký tự nào sau một ký tự nul đều được coi là một chuỗi khác nhau như thể chúng ở trên một dòng khác.
Các ký tự <CR>
và <LF>
được coi là các đầu cuối dòng kết thúc một chuỗi và không được bao gồm trong chuỗi.
Tất cả các ký tự byte đơn khác được bao gồm hoàn hảo trong một chuỗi.
Tìm kiếm tệp Unicode
FINDSTR không thể tìm kiếm chính xác hầu hết Unicode (UTF-16, UTF-16LE, UTF-16BE, UTF-32) vì nó không thể tìm kiếm các byte nul và Unicode thường chứa nhiều byte nul.
Tuy nhiên, lệnh TYPE chuyển đổi UTF-16LE với BOM thành một bộ ký tự byte đơn, do đó, một lệnh như sau sẽ hoạt động với UTF-16LE với BOM.
type unicode.txt|findstr "search"
Lưu ý rằng các điểm mã Unicode không được trang mã hoạt động của bạn hỗ trợ sẽ được chuyển đổi thành các ?
ký tự.
Có thể tìm kiếm UTF-8 miễn là chuỗi tìm kiếm của bạn chỉ chứa ASCII. Tuy nhiên, đầu ra giao diện điều khiển của bất kỳ ký tự UTF-8 nhiều byte nào sẽ không chính xác. Nhưng nếu bạn chuyển hướng đầu ra thành một tệp, thì kết quả sẽ được mã hóa chính xác UTF-8. Lưu ý rằng nếu tệp UTF-8 chứa BOM, thì BOM sẽ được coi là một phần của dòng đầu tiên, có thể loại bỏ tìm kiếm khớp với đầu dòng.
Có thể tìm kiếm các ký tự UTF-8 nhiều byte nếu bạn đặt chuỗi tìm kiếm của mình vào tệp tìm kiếm được mã hóa UTF-8 (không có BOM) và sử dụng tùy chọn / G.
Kết thúc dòng
FINDSTR ngắt dòng ngay lập tức sau mỗi <LF>. Sự hiện diện hay vắng mặt của <CR> không ảnh hưởng đến ngắt dòng.
Tìm kiếm trên các ngắt dòng
Như dự kiến, .
metacharacter regex sẽ không khớp với <CR> hoặc <LF>. Nhưng có thể tìm kiếm trên một ngắt dòng bằng cách sử dụng chuỗi tìm kiếm dòng lệnh. Cả hai ký tự <CR> và <LF> phải được khớp rõ ràng. Nếu tìm thấy kết quả khớp nhiều dòng, chỉ dòng thứ 1 của trận đấu được in. FINDSTR sau đó nhân đôi trở lại dòng thứ 2 trong nguồn và bắt đầu tìm kiếm lại từ đầu - loại tính năng "nhìn về phía trước".
Giả sử TEXT.TXT có các nội dung này (có thể là kiểu Unix hoặc Windows)
A
A
A
B
A
A
Sau đó, kịch bản này
@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
cho những kết quả này
1:A
2:A
5:A
Tìm kiếm trên các ngắt dòng bằng tùy chọn / G: FILE là không chính xác vì cách duy nhất để khớp với <CR> hoặc <LF> là thông qua biểu thức phạm vi lớp ký tự regex kẹp các ký tự EOL.
[<TAB>-<0x0B>]
khớp với <LF>, nhưng nó cũng khớp với <TAB> và <0x0B>
[<0x0C>-!]
khớp với <CR>, nhưng nó cũng khớp với <0x0C> và!
Lưu ý - ở trên là các biểu diễn tượng trưng của luồng byte regex vì tôi không thể biểu thị bằng các ký tự.
Trả lời tiếp tục trong phần 2 dưới đây ...
grep
mà đang rất được hiểu rõ và ghi nhận :-) Xem stackoverflow.com/questions/2635740/... ví dụ.