Pendahuluan
Banyak informasi dalam jawaban ini telah dikumpulkan berdasarkan percobaan yang dijalankan pada mesin Vista. Kecuali secara eksplisit dinyatakan sebaliknya, saya belum mengkonfirmasi apakah informasi tersebut berlaku untuk versi Windows lainnya.
Output FINDSTR
Dokumentasi tidak pernah mau repot untuk menjelaskan output FINDSTR. Ini menyinggung fakta bahwa garis yang cocok dicetak, tetapi tidak lebih.
Format output garis yang cocok adalah sebagai berikut:
nama file: lineNumber: lineOffset: teks
dimana
nama file: = Nama file yang berisi baris yang cocok. Nama file tidak dicetak jika permintaan secara eksplisit untuk satu file, atau jika mencari input yang dipipihkan atau input yang dialihkan. Saat dicetak, nama file akan selalu menyertakan informasi jalur yang disediakan. Informasi jalur tambahan akan ditambahkan jika /S
opsi digunakan. Jalur yang dicetak selalu relatif terhadap jalur yang disediakan, atau relatif terhadap direktori saat ini jika tidak ada yang disediakan.
Catatan - Awalan nama file dapat dihindari saat mencari beberapa file dengan menggunakan wildcard <
dan non-standar>
. Aturan pasti untuk cara kerja wildcard ini dapat ditemukan di sini . Terakhir, Anda dapat melihat contoh ini tentang cara kerja wildcard non-standar dengan FINDSTR .
lineNumber: = Nomor baris dari garis yang cocok diwakili sebagai nilai desimal dengan 1 mewakili baris pertama dari input. Hanya dicetak jika/N
opsi ditentukan.
lineOffset: = Offset byte desimal dari awal baris yang cocok, dengan 0 mewakili karakter pertama dari baris pertama. Hanya dicetak jika/O
opsi ditentukan. Ini bukan offset dari pertandingan di dalam garis. Ini adalah jumlah byte dari awal file ke awal baris.
text = Representasi biner dari baris yang cocok, termasuk <CR> dan / atau <LF>. Tidak ada yang tersisa dari output biner, sehingga contoh ini yang cocok dengan semua baris akan menghasilkan salinan biner yang tepat dari file asli.
FINDSTR "^" FILE >FILE_COPY
Opsi / A mengatur warna fileName :, lineNumber :, dan lineOffset: output saja. Teks dari baris yang cocok selalu ditampilkan dengan warna konsol saat ini. Opsi / A hanya berpengaruh ketika output ditampilkan langsung ke konsol. Opsi / A tidak berpengaruh jika output diarahkan ke file atau disalurkan. Lihat hasil edit 2018-08-18 dalam jawaban Aacini untuk deskripsi perilaku kereta ketika output diarahkan ke CON.
Sebagian besar karakter kontrol dan banyak karakter ASCII yang diperluas ditampilkan sebagai titik pada XP
FINDSTR pada XP menampilkan sebagian besar karakter kontrol yang tidak dapat dicetak dari garis yang cocok sebagai titik (titik) pada layar. Karakter kontrol berikut adalah pengecualian; mereka ditampilkan sebagai diri mereka sendiri: Tab 0x09, LineFeed 0x0A, Tab Vertikal 0x0B, Umpan Form 0x0C, Pengembalian Carriage 0x0D.
XP FINDSTR juga mengubah sejumlah karakter ASCII yang diperluas menjadi titik juga. Karakter ASCII yang diperluas yang ditampilkan sebagai titik-titik pada XP sama dengan yang diubah ketika diberikan pada baris perintah. Lihat bagian "Batas karakter untuk parameter baris perintah - Transformasi ASCII yang diperluas" , nanti dalam posting ini
Karakter kontrol dan ASCII yang diperluas tidak dikonversi ke titik-titik pada XP jika outputnya disalurkan, dialihkan ke file, atau dalam klausa FOR IN ().
Vista dan Windows 7 selalu menampilkan semua karakter sebagai diri mereka sendiri, tidak pernah sebagai titik.
Kembalikan Kode (ERRORLEVEL)
- 0 (sukses)
- Kecocokan ditemukan di setidaknya satu baris setidaknya satu file.
- 1 (gagal)
- Tidak ada kecocokan yang ditemukan di baris file apa pun.
- Warna tidak valid ditentukan oleh
/A:xx
opsi
- 2 (kesalahan)
- Opsi yang tidak kompatibel
/L
dan /R
keduanya ditentukan
- Hilang argumen setelah
/A:
, /F:
, /C:
, /D:
, atau/G:
- File ditentukan oleh
/F:file
atau /G:file
tidak ditemukan
- 255 (kesalahan)
Sumber data untuk pencarian (Diperbarui berdasarkan tes dengan Windows 7)
Findstr dapat mencari data hanya dari salah satu sumber berikut:
nama file ditentukan sebagai argumen dan / atau menggunakan /F:file
opsi.
stdin melalui pengalihan findstr "searchString" <file
aliran data dari pipa type file | findstr "searchString"
Argumen / opsi diutamakan alih redirection, yang lebih diutamakan daripada data pipa.
Argumen nama file dan /F:file
dapat digabungkan. Beberapa argumen nama file dapat digunakan. Jika beberapa /F:file
opsi ditentukan, maka hanya yang terakhir digunakan. Kartu liar diizinkan dalam argumen nama file, tetapi tidak dalam file yang ditunjuk oleh /F:file
.
Sumber string pencarian (Updated berdasarkan tes dengan Windows 7)
The /G:file
dan /C:string
pilihan dapat dikombinasikan. Beberapa /C:string
opsi dapat ditentukan. Jika beberapa /G:file
opsi ditentukan, maka hanya yang terakhir digunakan. Jika salah satu /G:file
atau /C:string
digunakan, maka semua argumen non-opsi diasumsikan sebagai file untuk dicari. Jika tidak satu pun /G:file
tidak /C:string
digunakan, maka argumen non-opsi pertama diperlakukan sebagai daftar istilah pencarian yang dibatasi ruang.
Nama file tidak boleh dikutip dalam file saat menggunakan /F:FILE
opsi.
Nama file dapat berisi spasi dan karakter khusus lainnya. Sebagian besar perintah mengharuskan nama file tersebut dikutip. Tetapi /F:files.txt
opsi FINDSTR mensyaratkan bahwa nama file di dalam files.txt TIDAK boleh dikutip. File tidak akan ditemukan jika namanya dikutip.
BUG - Nama file 8,3 pendek dapat memecahkan /D
dan /S
opsi
Seperti dengan semua perintah Windows, FINDSTR akan berusaha untuk mencocokkan nama panjang dan nama 8.3 pendek ketika mencari file untuk mencari. Asumsikan folder saat ini berisi file-file tidak kosong berikut:
b1.txt
b.txt2
c.txt
Perintah berikut akan berhasil menemukan semua 3 file:
findstr /m "^" *.txt
b.txt2
cocok karena nama pendek yang sesuai B9F64~1.TXT
cocok. Ini konsisten dengan perilaku semua perintah Windows lainnya.
Tetapi bug dengan opsi /D
dan /S
menyebabkan perintah berikut hanya menemukanb1.txt
findstr /m /d:. "^" *.txt
findstr /m /s "^" *.txt
Bug mencegah b.txt2
ditemukan, serta semua nama file yang diurutkan setelah b.txt2
dalam direktori yang sama. File tambahan yang mengurutkan sebelumnya, seperti a.txt
, ditemukan. File tambahan yang mengurutkan kemudian, seperti d.txt
, dilewatkan begitu bug telah dipicu.
Setiap direktori yang dicari diperlakukan secara independen. Misalnya, /S
opsi tersebut akan berhasil mulai mencari di folder anak setelah gagal menemukan file di induknya, tetapi begitu bug tersebut menyebabkan nama file pendek terlewatkan pada anak, maka semua file berikutnya dalam folder anak itu juga akan terlewatkan .
Perintah ini berfungsi bebas bug jika nama file yang sama dibuat pada mesin yang menonaktifkan pembuatan nama NTFS 8.3. Tentu saja b.txt2
tidak akan ditemukan, tetapi c.txt
akan ditemukan dengan benar.
Tidak semua nama pendek memicu bug. Semua contoh perilaku disadap yang saya lihat melibatkan ekstensi yang lebih panjang dari 3 karakter dengan nama pendek 8.3 yang dimulai sama dengan nama normal yang tidak memerlukan nama 8.3.
Bug telah dikonfirmasi pada XP, Vista, dan Windows 7.
Karakter non-cetak dan /P
pilihan
The /P
opsi menyebabkan FINDSTR untuk melewati file yang berisi salah satu kode desimal byte berikut:
0-7, 14-25, 27-31.
Dengan kata lain, /P
opsi ini hanya akan melewatkan file yang berisi karakter kontrol yang tidak dapat dicetak. Karakter kontrol adalah kode yang kurang dari atau sama dengan 31 (0x1F). FINDSTR memperlakukan karakter kontrol berikut ini sebagai dapat dicetak:
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)
Semua karakter kontrol lainnya diperlakukan sebagai tidak dapat dicetak, yang keberadaannya menyebabkan /P
opsi untuk melewatkan file.
Input yang Dipipakan dan Diarahkan ulang mungkin telah <CR><LF>
ditambahkan.
Jika input tersebut disalurkan ke dalam dan karakter terakhir dari aliran tidak <LF>
, maka FINDSTR akan secara otomatis menambahkan <CR><LF>
ke input. Ini telah dikonfirmasi pada XP, Vista dan Windows 7. (Dulu saya berpikir bahwa pipa Windows bertanggung jawab untuk memodifikasi input, tetapi sejak itu saya menemukan bahwa FINDSTR sebenarnya melakukan modifikasi.)
Hal yang sama berlaku untuk input yang dialihkan ke Vista. Jika karakter terakhir dari file yang digunakan sebagai input redirected bukan <LF>
, maka FINDSTR akan secara otomatis menambahkan <CR><LF>
ke input. Namun, XP dan Windows 7 tidak mengubah input yang dialihkan.
FINDSTR hang pada XP dan Windows 7 jika input yang dialihkan tidak berakhir dengan<LF>
Ini adalah "fitur" yang jahat di XP dan Windows 7. Jika karakter terakhir dari file yang digunakan sebagai input yang dialihkan tidak berakhir <LF>
, maka FINDSTR akan menggantung tanpa batas setelah itu mencapai akhir file yang diarahkan.
Baris terakhir dari data Piped dapat diabaikan jika terdiri dari satu karakter.
Jika input disalurkan dan baris terakhir terdiri dari satu karakter yang tidak diikuti <LF>
, maka FINDSTR sepenuhnya mengabaikan baris terakhir.
Contoh - Perintah pertama dengan satu karakter dan tidak <LF>
gagal untuk mencocokkan, tetapi perintah kedua dengan 2 karakter berfungsi dengan baik, seperti halnya perintah ketiga yang memiliki satu karakter dengan mengakhiri baris baru.
> set /p "=x" <nul | findstr "^"
> set /p "=xx" <nul | findstr "^"
xx
> echo x| findstr "^"
x
Dilaporkan oleh pengguna DosTips, Sponge Belly di bug findstr baru . Dikonfirmasi pada XP, Windows 7 dan Windows 8. Belum pernah mendengar tentang Vista. (Saya tidak lagi memiliki Vista untuk diuji).
Sintaksis
Opsi Opsi dapat diawali dengan salah satu /
atau -
Opsi dapat disatukan setelah satu /
atau -
. Namun, daftar opsi gabungan dapat memuat paling banyak satu opsi multi-karakter seperti OFF atau F :, dan opsi multi-karakter harus menjadi opsi terakhir dalam daftar.
Berikut ini adalah semua cara yang setara untuk mengekspresikan pencarian regex case tidak sensitif untuk setiap baris yang berisi "halo" dan "selamat tinggal" dalam urutan apa pun
/i /r /c:"hello.*goodbye" /c:"goodbye.*hello"
-i -r -c:"hello.*goodbye" /c:"goodbye.*hello"
/irc:"hello.*goodbye" /c:"goodbye.*hello"
Batas panjang String Pencarian
Pada Vista, panjang maksimum yang diizinkan untuk string pencarian tunggal adalah 511 byte. Jika ada string pencarian melebihi 511 maka hasilnya adalah FINDSTR: Search string too long.
kesalahan dengan ERRORLEVEL 2.
Saat melakukan pencarian ekspresi reguler, panjang string pencarian maksimum adalah 254. Ekspresi reguler dengan panjang antara 255 dan 511 akan menghasilkan FINDSTR: Out of memory
kesalahan dengan ERRORLEVEL 2. Panjang ekspresi reguler> 511 menghasilkan FINDSTR: Search string too long.
kesalahan.
Pada Windows XP panjang string pencarian tampaknya lebih pendek. Galat Findstr: "Cari string terlalu panjang": Bagaimana cara mengekstrak dan mencocokkan substring dalam loop "for"?
Batas XP adalah 127 byte untuk pencarian literal dan regex.
Batas Panjang Baris
File ditentukan sebagai argumen baris perintah atau melalui opsi / F: FILE tidak memiliki batas panjang garis yang diketahui. Pencarian berhasil dijalankan terhadap file 128MB yang tidak mengandung satu <LF>.
Data pipa dan input Redirected terbatas pada 8191 byte per baris. Batas ini adalah "fitur" dari FINDSTR. Itu tidak melekat pada pipa atau pengalihan. FINDSTR menggunakan stdin atau input yang dialihkan tidak akan pernah cocok dengan garis apa pun yang> = 8k byte. Lines> = 8k menghasilkan pesan kesalahan ke stderr, tetapi ERRORLEVEL masih 0 jika string pencarian ditemukan di setidaknya satu baris dari setidaknya satu file.
Jenis pencarian default: Ekspresi literal vs Reguler
/C:"string"
- Standarnya adalah / L literal. Secara eksplisit menggabungkan opsi / L dengan / C: "string" tentu saja bekerja tetapi berlebihan.
"string argument"
- Default tergantung pada konten string pencarian pertama. (Ingat bahwa <spasi> digunakan untuk membatasi string pencarian.) Jika string pencarian pertama adalah ekspresi reguler yang valid yang mengandung setidaknya satu meta-karakter yang tidak diloloskan, maka semua string pencarian diperlakukan sebagai ekspresi reguler. Kalau tidak, semua string pencarian diperlakukan sebagai literal. Misalnya, "51.4 200"
akan diperlakukan sebagai dua ekspresi reguler karena string pertama berisi titik yang tidak diloloskan, sedangkan "200 51.4"
akan diperlakukan sebagai dua literal karena string pertama tidak mengandung meta-karakter.
/G:file
- Default tergantung pada konten dari baris non-kosong pertama dalam file. Jika string pencarian pertama adalah ekspresi reguler yang valid yang berisi setidaknya satu meta-karakter yang tidak diloloskan, maka semua string pencarian diperlakukan sebagai ekspresi reguler. Kalau tidak, semua string pencarian diperlakukan sebagai literal.
Rekomendasi - Selalu tentukan secara eksplisit /L
opsi literal atau /R
opsi ekspresi reguler saat menggunakan "string argument"
atau /G:file
.
BUG - Menentukan beberapa string pencarian literal dapat memberikan hasil yang tidak dapat diandalkan
Contoh FINDSTR sederhana berikut gagal menemukan kecocokan, meskipun seharusnya.
echo ffffaaa|findstr /l "ffffaaa faffaffddd"
Bug ini telah dikonfirmasi pada Windows Server 2003, Windows XP, Vista, dan Windows 7.
Berdasarkan percobaan, FINDSTR mungkin gagal jika semua kondisi berikut dipenuhi:
- Pencarian menggunakan beberapa string pencarian literal
- String pencarian memiliki panjang yang berbeda
- String pencarian pendek memiliki sejumlah tumpang tindih dengan string pencarian yang lebih panjang
- Pencarian sensitif huruf besar (tidak ada
/I
opsi)
Dalam setiap kegagalan yang saya lihat, selalu merupakan salah satu string pencarian pendek yang gagal.
Untuk info lebih lanjut, lihat Mengapa FINDSTR ini tidak contoh dengan beberapa string pencarian literal menemukan kecocokan?
Kutipan dan backslahses dalam argumen baris perintah
Catatan - Komentar Pengguna MC ND mencerminkan aturan rumit yang sebenarnya mengerikan untuk bagian ini. Ada 3 fase penguraian yang terlibat:
- Cmd.exe pertama mungkin memerlukan beberapa kutipan untuk diloloskan sebagai ^ "(benar-benar tidak ada hubungannya dengan FINDSTR)
- FINDSTR Selanjutnya menggunakan parser argumen MS C / C ++ pra 2008 , yang memiliki aturan khusus untuk "dan \
- Setelah parser argumen selesai, FINDSTR juga memperlakukan \ diikuti oleh karakter alpha-numeric sebagai literal, tetapi \ diikuti oleh karakter non-alpha-numeric sebagai karakter escape
Sisa dari bagian yang disorot ini tidak 100% benar. Ini dapat berfungsi sebagai panduan untuk banyak situasi, tetapi aturan di atas diperlukan untuk pemahaman total.
Lolos Kutipan dalam string pencarian baris perintah
Kutipan dalam string pencarian baris perintah harus diloloskan dengan seperti backslash
\"
. Ini berlaku untuk string pencarian literal dan regex. Informasi ini telah dikonfirmasi pada XP, Vista, dan Windows 7.
Catatan: Kutipan juga mungkin perlu diloloskan untuk parser CMD.EXE, tetapi ini tidak ada hubungannya dengan FINDSTR. Misalnya, untuk mencari satu kutipan, Anda dapat menggunakan:
FINDSTR \^" file && echo found || echo not found
Meloloskan Backslash dalam string pencarian literal baris perintah.
Backslash dalam string pencarian literal biasanya dapat direpresentasikan sebagai
\
atau sebagai \\
. Mereka biasanya setara. (Mungkin ada kasus yang tidak biasa di Vista di mana backslash harus selalu lolos, tetapi saya tidak lagi memiliki mesin Vista untuk menguji) .
Tetapi ada beberapa kasus khusus:
Saat mencari garis miring terbalik berturut-turut, semua kecuali yang terakhir harus diloloskan. Backslash terakhir secara opsional dapat dihindari.
\\
dapat dikodekan sebagai \\\
atau\\\\
\\\
dapat dikodekan sebagai \\\\\
atau\\\\\\
Mencari satu atau lebih backslash sebelum penawaran aneh. Logika akan menyarankan bahwa kutipan harus diloloskan, dan masing-masing backslash terkemuka harus diloloskan, tetapi ini tidak berhasil! Sebagai gantinya, masing-masing backslash terkemuka harus diloloskan ganda, dan kutipan diloloskan secara normal:
\"
harus diberi kode sebagai \\\\\"
\\"
harus diberi kode sebagai \\\\\\\\\"
Seperti disebutkan sebelumnya, satu atau lebih tanda kutip yang lolos mungkin juga memerlukan pelarian dengan ^
untuk parser CMD
Info di bagian ini telah dikonfirmasi pada XP dan Windows 7.
Lolos Backslash dalam string pencarian regex baris perintah
Hanya Vista: Garis miring terbalik dalam regex harus berupa dua lolos \\\\
, atau tunggal lolos dalam kelas karakter yang ditetapkan seperti
[\\]
XP dan Windows 7: Backslash di regex selalu dapat direpresentasikan sebagai [\\]
. Biasanya dapat direpresentasikan sebagai\\
. Tetapi ini tidak pernah berhasil jika garis miring terbalik mendahului kutipan yang lolos.
Satu atau lebih backslash sebelum kutipan yang lolos harus berupa double escape, atau diberi kode lain [\\]
\"
dapat dikodekan sebagai \\\\\"
atau[\\]\"
\\"
dapat dikodekan sebagai \\\\\\\\\"
atau [\\][\\]\"
atau\\[\\]\"
Meloloskan Kutipan dan Backslash dalam / G: FILE string pencarian literal
Standalone quotes dan backslash dalam file string pencarian literal yang ditentukan oleh / G: file tidak perlu melarikan diri, tetapi bisa juga.
"
dan \"
setara.
\
dan \\
setara.
Jika tujuannya adalah untuk menemukan \\, maka setidaknya backslash terkemuka harus diloloskan. Keduanya \\\
dan\\\\
bekerja.
Jika maksudnya adalah untuk menemukan \ ", maka setidaknya garis miring terbalik harus diloloskan. Keduanya \\"
dan\\\"
berfungsi.
Lolos Kutipan dan Backslash dalam / G: FILE regex search string
Ini adalah satu kasus di mana urutan pelarian bekerja seperti yang diharapkan berdasarkan pada dokumentasi. Kutipan bukan metacharacter regex, jadi itu tidak perlu melarikan diri (tetapi bisa). Backslash adalah metacharacter regex, jadi ia harus dihilangkan.
Batas karakter untuk parameter baris perintah - Transformasi ASCII yang diperluas
Karakter nol (0x00) tidak dapat muncul di string apa pun di baris perintah. Karakter byte tunggal lainnya dapat muncul dalam string (0x01 - 0xFF). Namun, FINDSTR mengubah banyak karakter ASCII yang diperluas yang ditemukannya di dalam parameter baris perintah menjadi karakter lain. Ini memiliki dampak besar dalam dua cara:
1) Banyak karakter ASCII yang diperluas tidak akan cocok dengan dirinya sendiri jika digunakan sebagai string pencarian pada baris perintah. Batasan ini sama untuk pencarian literal dan regex. Jika string pencarian harus mengandung ASCII yang diperluas, maka the/G:FILE
opsi tersebut harus digunakan sebagai gantinya.
2) FINDSTR mungkin gagal menemukan file jika nama tersebut berisi karakter ASCII yang diperluas dan nama file ditentukan pada baris perintah. Jika file yang akan dicari berisi ASCII yang diperluas dalam nama, maka file/F:FILE
opsi tersebut harus digunakan.
Berikut adalah daftar lengkap transformasi karakter ASCII yang diperluas yang dilakukan FINDSTR pada string baris perintah. Setiap karakter direpresentasikan sebagai nilai kode byte desimal. Kode pertama mewakili karakter seperti yang disediakan pada baris perintah, dan kode kedua mewakili karakter yang diubahnya. Catatan - daftar ini dikompilasi di mesin AS. Saya tidak tahu apa dampak bahasa lain pada daftar ini.
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
Karakter apa pun> 0 yang tidak ada dalam daftar di atas diperlakukan sebagai dirinya sendiri, termasuk <CR>
dan < LF>
. Cara termudah untuk memasukkan karakter aneh seperti <CR>
dan <LF>
adalah memasukkannya ke dalam variabel lingkungan dan menggunakan ekspansi yang tertunda dalam argumen baris perintah.
Batas karakter untuk string yang ditemukan dalam file yang ditentukan oleh / G: FILE dan / F: opsi FILE
Karakter nul (0x00) dapat muncul dalam file, tetapi berfungsi seperti terminator string C. Setiap karakter setelah karakter nul diperlakukan sebagai string yang berbeda seolah-olah mereka berada di baris lain.
The <CR>
dan <LF>
karakter diperlakukan sebagai terminator garis yang mengakhiri string, dan tidak termasuk dalam string.
Semua karakter byte tunggal lainnya dimasukkan dengan sempurna dalam string.
Mencari file Unicode
FINDSTR tidak dapat mencari dengan benar sebagian besar Unicode (UTF-16, UTF-16LE, UTF-16BE, UTF-32) karena tidak dapat mencari nul byte dan Unicode biasanya berisi banyak nul byte.
Namun, perintah TYPE mengubah UTF-16LE dengan BOM ke set karakter byte tunggal, jadi perintah seperti berikut ini akan bekerja dengan UTF-16LE dengan BOM.
type unicode.txt|findstr "search"
Perhatikan bahwa titik kode Unicode yang tidak didukung oleh halaman kode aktif Anda akan dikonversi menjadi ?
karakter.
Dimungkinkan untuk mencari UTF-8 selama string pencarian Anda hanya mengandung ASCII. Namun, output konsol karakter multi-byte UTF-8 tidak akan benar. Tetapi jika Anda mengarahkan output ke file, maka hasilnya akan dikodekan dengan benar UTF-8. Perhatikan bahwa jika file UTF-8 berisi BOM, maka BOM akan dianggap sebagai bagian dari baris pertama, yang dapat membuang pencarian yang cocok dengan awal baris.
Dimungkinkan untuk mencari multi-byte karakter UTF-8 jika Anda meletakkan string pencarian Anda dalam file pencarian yang dikodekan UTF-8 (tanpa BOM), dan menggunakan opsi / G.
End Of Line
FINDSTR memecah garis segera setelah setiap <LF>. Ada atau tidaknya <CR> tidak berdampak pada jeda baris.
Mencari lintas jeda
Seperti yang diharapkan, .
metacharacter regex tidak akan cocok dengan <CR> atau <LF>. Tetapi dimungkinkan untuk mencari melintasi jeda baris menggunakan string pencarian baris perintah. Karakter <CR> dan <LF> harus dicocokkan secara eksplisit. Jika kecocokan multi-baris ditemukan, hanya baris pertama dari kecocokan yang dicetak. FINDSTR kemudian menggandakan kembali ke baris ke-2 di sumber dan memulai pencarian lagi - semacam fitur tipe "lihat ke depan".
Asumsikan TEXT.TXT memiliki konten ini (bisa gaya Unix atau Windows)
A
A
A
B
A
A
Lalu skrip ini
@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
memberikan hasil ini
1:A
2:A
5:A
Pencarian lintas baris menggunakan opsi / G: FILE tidak tepat karena satu-satunya cara untuk mencocokkan <CR> atau <LF> adalah melalui ekspresi rentang kelas karakter regex yang mengapit karakter EOL.
[<TAB>-<0x0B>]
cocok dengan <LF>, tetapi juga cocok dengan <TAB> dan <0x0B>
[<0x0C>-!]
cocok dengan <CR>, tetapi juga cocok dengan <0x0C> dan!
Catatan - di atas adalah representasi simbolis dari aliran byte regex karena saya tidak dapat secara grafis mewakili karakter.
Jawab dilanjutkan di bagian 2 di bawah ...
grep
yang ini sangat dipahami dengan baik dan didokumentasikan :-) Lihat stackoverflow.com/questions/2635740/... misalnya.