Perintah Windows FINDSTR didokumentasikan dengan mengerikan. Ada bantuan baris perintah yang sangat dasar tersedia melalui FINDSTR /?
, atau HELP FINDSTR
, tetapi sangat tidak memadai. Ada sedikit dokumentasi online lagi di https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/findstr .
Ada banyak fitur dan batasan FINDSTR yang bahkan tidak diisyaratkan dalam dokumentasi. Mereka juga tidak dapat diantisipasi tanpa pengetahuan sebelumnya dan / atau eksperimen yang cermat.
Jadi pertanyaannya adalah - Apa saja fitur dan batasan FINDSTR yang tidak berdokumen?
Tujuan dari pertanyaan ini adalah untuk menyediakan repositori lengkap dari banyak fitur yang tidak terdokumentasi sehingga:
A) Pengembang dapat mengambil keuntungan penuh dari fitur yang ada.
B) Pengembang tidak membuang-buang waktu mereka bertanya-tanya mengapa sesuatu tidak berfungsi padahal seharusnya demikian.
Pastikan Anda mengetahui dokumentasi yang ada sebelum merespons. Jika informasi tersebut dicakup oleh BANTUAN, maka itu bukan milik di sini.
Ini juga bukan tempat untuk menunjukkan kegunaan FINDSTR yang menarik. Jika orang yang logis dapat mengantisipasi perilaku penggunaan FINDSTR tertentu berdasarkan pada dokumentasi, maka itu tidak termasuk di sini.
Sejalan dengan itu, jika orang yang logis dapat mengantisipasi perilaku penggunaan tertentu berdasarkan informasi yang terkandung dalam jawaban yang ada, maka sekali lagi, itu tidak termasuk di sini.
sumber
grep
yang ini sangat dipahami dengan baik dan didokumentasikan :-) Lihat stackoverflow.com/questions/2635740/... misalnya.Jawaban:
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.
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)
/A:xx
opsi/L
dan/R
keduanya ditentukan/A:
,/F:
,/C:
,/D:
, atau/G:
/F:file
atau/G:file
tidak ditemukanmelihat batas istilah kelas karakter Regex dan BUG di bagian 2 dari jawaban
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
opsiSeperti 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:
Perintah berikut akan berhasil menemukan semua 3 file:
b.txt2
cocok karena nama pendek yang sesuaiB9F64~1.TXT
cocok. Ini konsisten dengan perilaku semua perintah Windows lainnya.Tetapi bug dengan opsi
/D
dan/S
menyebabkan perintah berikut hanya menemukanb1.txt
Bug mencegah
b.txt2
ditemukan, serta semua nama file yang diurutkan setelahb.txt2
dalam direktori yang sama. File tambahan yang mengurutkan sebelumnya, sepertia.txt
, ditemukan. File tambahan yang mengurutkan kemudian, sepertid.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, tetapic.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
pilihanThe
/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: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.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 menghasilkanFINDSTR: 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.
Bug ini telah dikonfirmasi pada Windows Server 2003, Windows XP, Vista, dan Windows 7.
Berdasarkan percobaan, FINDSTR mungkin gagal jika semua kondisi berikut dipenuhi:
/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?
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.
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.
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)
Lalu skrip ini
memberikan hasil ini
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 ...
sumber
addpath.bat
dari Q141344 dan findstr, yang mungkin terkait dengan masalah gantung Win7 yang disebutkan di atas. Saya telah membuat ruang obrolan untuk mencoba dan melacaknya, untuk siapa saja yang tertarik: chat.stackoverflow.com/rooms/13177/…/S
dan/D
opsi yang berasal dari nama file 8,3 pendek.<LF>
Jawaban dilanjutkan dari bagian 1 di atas - Saya sudah mengalami batas jawaban 30.000 karakter :-(
Dukungan Ekspresi Reguler Terbatas (regex)
terbatas Dukungan FINDSTR untuk ekspresi reguler sangat terbatas. Jika tidak ada dalam dokumentasi BANTUAN, itu tidak didukung.
Di luar itu, ekspresi regex yang didukung diimplementasikan dengan cara yang sama sekali tidak standar, sehingga hasilnya bisa berbeda maka akan diharapkan berasal dari sesuatu seperti grep atau perl.
Jangkar Posisi Garis Regex ^ dan $
^
cocok dengan awal aliran input serta posisi apa pun segera setelah <LF>. Karena FINDSTR juga memecah baris setelah <LF>, regex sederhana "^" akan selalu cocok dengan semua baris dalam file, bahkan file biner.$
cocok dengan posisi apa pun segera sebelum <CR>. Ini berarti bahwa string pencarian regex yang mengandung$
tidak akan pernah cocok dengan baris apa pun dalam file teks gaya Unix, juga tidak akan cocok dengan baris terakhir file teks Windows jika tidak ada penanda EOL dari <CR> <LF>.Catatan - Seperti dibahas sebelumnya, masukan yang dialihkan dan dialihkan ke FINDSTR mungkin telah
<CR><LF>
ditambahkan yang tidak ada dalam sumber. Jelas ini dapat memengaruhi pencarian regex yang menggunakan$
.String pencarian apa pun dengan karakter sebelum
^
atau sesudahnya$
akan selalu gagal menemukan kecocokan.Opsi Posisi / B / E / X
Opsi posisi bekerja sama dengan
^
dan$
, kecuali mereka juga berfungsi untuk string pencarian literal./ B berfungsi sama seperti
^
pada awal string pencarian regex./ E berfungsi sama seperti
$
pada akhir string pencarian regex./ X berfungsi sama seperti memiliki keduanya
^
di awal dan$
di akhir string pencarian regex.Batas kata
\<
regex haruslah istilah pertama di regex. Regex tidak akan cocok dengan apa pun jika ada karakter lain yang mendahuluinya.\<
sesuai dengan awal input, awal baris (posisi segera setelah <LF>), atau posisi segera setelah karakter "non-kata". Karakter selanjutnya tidak harus berupa karakter "kata".\>
harus menjadi istilah terakhir di regex. Regex tidak akan cocok dengan apa pun jika ada karakter lain yang mengikutinya.\>
sesuai dengan akhir input, posisi segera sebelum <CR>, atau posisi segera sebelum karakter "non-kata". Karakter sebelumnya tidak harus berupa karakter "kata".Berikut adalah daftar lengkap karakter "non-kata", direpresentasikan sebagai kode byte desimal. Catatan - daftar ini dikompilasi di mesin AS. Saya tidak tahu apa dampak bahasa lain pada daftar ini.
Rentang kelas karakter Regex [xy]
Rentang kelas karakter tidak berfungsi seperti yang diharapkan. Lihat pertanyaan ini: Mengapa findstr tidak menangani case dengan benar (dalam beberapa keadaan)? , bersama dengan jawaban ini: https://stackoverflow.com/a/8767815/1012053 .
Masalahnya adalah FINDSTR tidak menyusun karakter dengan nilai kode byte mereka (biasanya dianggap sebagai kode ASCII, tetapi ASCII hanya didefinisikan dari 0x00 - 0x7F). Sebagian besar implementasi regex akan memperlakukan [AZ] sebagai huruf kapital semua huruf Inggris. Tetapi FINDSTR menggunakan urutan pemeriksaan yang kira-kira sesuai dengan cara kerja SORT. Jadi [AZ] termasuk alfabet Inggris lengkap, baik huruf besar dan kecil (kecuali untuk "a"), serta karakter alfa non-Inggris dengan diakritik.
Di bawah ini adalah daftar lengkap semua karakter yang didukung oleh FINDSTR, diurutkan dalam urutan pemeriksaan yang digunakan oleh FINDSTR untuk menetapkan rentang kelas karakter regex. Karakter direpresentasikan sebagai nilai kode byte desimal mereka. Saya percaya urutan pemeriksaan masuk akal jika karakter dilihat menggunakan kode halaman 437. Catatan - daftar ini dikompilasi pada mesin AS. Saya tidak tahu apa dampak bahasa lain pada daftar ini.
Batas jangka kelas karakter
regex dan BUG Tidak hanya FINDSTR dibatasi hingga maksimum 15 syarat kelas karakter dalam suatu regex, ia gagal menangani upaya untuk melampaui batas dengan benar. Menggunakan 16 atau lebih istilah kelas karakter menghasilkan jendela pop-up interaktif yang menyatakan "Utilitas Cari String (QGREP) telah mengalami masalah dan harus ditutup. Kami mohon maaf atas ketidaknyamanan ini." Teks pesan sedikit berbeda tergantung pada versi Windows. Berikut adalah salah satu contoh FINDSTR yang akan gagal:
Bug ini dilaporkan oleh pengguna DosTips Judago di sini . Ini telah dikonfirmasi pada XP, Vista, dan Windows 7.
Pencarian regex gagal (dan mungkin hang tanpa batas) jika mereka memasukkan kode byte 0xFF (desimal 255)
Setiap pencarian regex yang menyertakan kode byte 0xFF (desimal 255) akan gagal. Gagal jika kode byte 0xFF disertakan secara langsung, atau jika secara implisit termasuk dalam rentang kelas karakter. Ingat bahwa rentang kelas karakter FINDSTR tidak menyusun karakter berdasarkan nilai kode byte. Karakter
<0xFF>
muncul relatif awal dalam urutan susunan antara karakter<space>
dan<tab>
. Jadi rentang kelas karakter apa pun yang mencakup keduanya<space>
dan<tab>
akan gagal.Perilaku tepatnya berubah sedikit tergantung pada versi Windows. Windows 7 hang tanpa batas jika 0xFF disertakan. XP tidak hang, tetapi selalu gagal menemukan kecocokan, dan kadang-kadang mencetak pesan kesalahan berikut - "Proses mencoba menulis ke pipa yang tidak ada."
Saya tidak lagi memiliki akses ke mesin Vista, jadi saya belum dapat menguji pada Vista.
Regex bug:
.
dan[^anySet]
dapat mencocokkan End-Of-FileThe regex
.
meta-karakter hanya harus sesuai karakter apapun selain<CR>
atau<LF>
. Ada bug yang memungkinkannya untuk mencocokkan End-Of-File jika baris terakhir dalam file tidak dihentikan oleh<CR>
atau<LF>
. Namun,.
tidak akan cocok dengan file kosong.Misalnya, file bernama "test.txt" yang berisi satu baris
x
, tanpa mengakhiri<CR>
atau<LF>
, akan cocok dengan yang berikut:Bug ini telah dikonfirmasi pada XP dan Win7.
Hal yang sama tampaknya berlaku untuk set karakter negatif. Sesuatu seperti
[^abc]
akan cocok dengan End-Of-File. Set karakter positif suka[abc]
sepertinya berfungsi dengan baik. Saya hanya menguji ini pada Win7.sumber
type
kefindstr
.findstr
mendukung banyak/c:
string pencarian. Saya tahu jawaban Anda menunjukkan hal ini. Tetapi itu adalah sesuatu yang tidak didokumentasikan; dan saya cukup terkejut mengetahui fitur tersebut setelah digunakanfindstr
tanpanya selama beberapa tahun.LF
masalah yang Anda dokumentasikan. Saya menyadari file pengujian saya tidak berakhirLF
karena saya gunakancopy
dalam mode append untuk membuatnya. Saya telah menempatkan sesi baris perintah untuk menunjukkan masalah menjadi jawaban ( stackoverflow.com/a/22943056/224704 ). Perhatikan bahwa input tidak dialihkan, namun pencarian hang. Perintah pencarian yang sama persis tidak hang dengan file yang lebih kecil yang sama tidak berakhir denganLF
.findstr /R /C:"^[0-9][0-9]* [0-3][0-9][0-9]-[0-9][0-9]:[0-5][0-9]:[0-5][0-9]\.[0-9][0-9]* [0-9]*\.[0-9]*"
(15 kelas karakter) -ErrorLevel = -1073740791 (0xC0000409)
, kesalahan jendela dialog :Find String (QGREP) Utility has stopped working
; setelah menghapus satu atau dua karakter meta kelas (*\.
), berfungsi ...findstr
terkadang hang tiba-tiba ketika mencari file besar.Saya belum mengkonfirmasi kondisi atau ukuran batas yang tepat. Saya menduga file apa pun yang lebih besar 2GB mungkin berisiko.
Saya memiliki pengalaman yang beragam dengan ini, jadi ini lebih dari sekedar ukuran file. Ini sepertinya merupakan variasi pada FINDSTR yang tergantung pada XP dan Windows 7 jika input yang dialihkan tidak diakhiri dengan LF , tetapi seperti yang diperlihatkan masalah khusus ini muncul ketika input tidak dialihkan.
Sesi baris perintah berikut (Windows 7) menunjukkan bagaimana cara
findstr
menggantung ketika mencari file 3GB.Catatan, saya telah memverifikasi dalam hex editor yang semua barisnya diakhiri
CRLF
. Satu-satunya anomali adalah bahwa file tersebut diakhiri dengan0x1A
karena caracopy
kerja . Namun perlu dicatat, bahwa anomali ini tidak menyebabkan masalah pada file "kecil" .Dengan pengujian tambahan, saya telah mengkonfirmasi yang berikut:
copy
dengan/b
opsi untuk file biner mencegah penambahan0x1A
karakter, danfindstr
tidak menggantung pada file 3GB.findstr
hang.0x1A
karakter tidak menimbulkan masalah pada file "kecil". (Demikian pula untuk karakter penghentian lainnya.)CRLF
setelah0x1A
menyelesaikan masalah. (LF
dengan sendirinya mungkin sudah cukup.)type
untuk mem-pipe file menjadifindstr
karya tanpa menggantung. (Ini mungkin karena efek samping dari salah satutype
atau|
yang memasukkan End Of Line tambahan.)<
juga menyebabkanfindstr
hang. Tapi ini diharapkan; seperti yang dijelaskan dalam posting dbenham : "input yang dialihkan harus diakhiri denganLF
" .sumber
<LF>
. File dua byte lebih kecil tidak hang. Sangat jahat!Ketika beberapa perintah tertutup dalam tanda kurung dan ada file yang dialihkan ke seluruh blok:
... maka file tetap terbuka selama perintah di blok aktif, sehingga perintah dapat memindahkan penunjuk file dari file yang diarahkan. Perintah MORE dan FIND memindahkan pointer file Stdin ke awal file sebelum memprosesnya, sehingga file yang sama dapat diproses beberapa kali di dalam blok. Misalnya, kode ini:
... menghasilkan hasil yang sama dari yang ini:
Kode ini:
... menghasilkan hasil yang sama dari yang ini:
FINDSTR berbeda; itu tidak memindahkan penunjuk file Stdin dari posisi saat ini. Misalnya, kode ini menyisipkan baris baru setelah baris pencarian:
Kami dapat memanfaatkan fitur ini dengan baik dengan bantuan program tambahan yang memungkinkan kami untuk memindahkan penunjuk file dari file yang dialihkan, seperti yang ditunjukkan dalam contoh ini .
Perilaku ini pertama kali dilaporkan oleh jeb di posting ini .
EDIT 2018-08-18 : Bug FINDSTR baru dilaporkan
Perintah FINDSTR memiliki bug aneh yang terjadi ketika perintah ini digunakan untuk menampilkan karakter berwarna DAN output dari perintah tersebut dialihkan ke perangkat CON. Untuk detail tentang cara menggunakan perintah FINDSTR untuk menampilkan teks berwarna, lihat topik ini .
Ketika output dari bentuk perintah FINDSTR ini dialihkan ke CON, sesuatu yang aneh terjadi setelah teks dihasilkan dalam warna yang diinginkan: semua teks setelah itu output sebagai karakter "tidak terlihat", meskipun deskripsi yang lebih tepat adalah bahwa teks tersebut adalah output sebagai teks hitam di atas latar belakang hitam. Teks asli akan muncul jika Anda menggunakan perintah COLOR untuk mengatur ulang warna latar depan dan latar belakang dari seluruh layar. Namun, ketika teks "tidak terlihat" kita bisa menjalankan perintah SET / P, sehingga semua karakter yang dimasukkan tidak akan muncul di layar. Perilaku ini dapat digunakan untuk memasukkan kata sandi.
sumber
Saya ingin melaporkan bug mengenai bagian Sumber data untuk mencari di jawaban pertama saat menggunakan en dash (-) atau em dash (-) di dalam nama file.
Lebih khusus lagi, jika Anda akan menggunakan opsi pertama - nama file ditentukan sebagai argumen , file tidak akan ditemukan. Segera setelah Anda menggunakan opsi 2 - stdin melalui pengalihan atau 3 - aliran data dari pipa , findstr akan menemukan file.
Misalnya, skrip kumpulan sederhana ini:
akan dicetak:
Nama file dengan tanda hubung:
Sebagai argumen
FINDSTR: Tidak dapat membuka nama file dengan - dash.txt
Sebagai stdin melalui pengalihan,
saya file dengan tanda hubung en.
Sebagai datastream dari pipa
saya file dengan tanda hubung en.
Nama file dengan tanda hubung:
Sebagai argumen
FINDSTR: Tidak dapat membuka nama file dengan - dash.txt
Sebagai stdin melalui pengalihan
saya file dengan tanda hubung em.
Sebagai datastream dari pipa
saya file dengan tanda hubung em.
Semoga ini bisa membantu.
M.
sumber
The
findstr
perintah menetapkanErrorLevel
(atau kode keluar) ke salah satu dari nilai berikut, mengingat bahwa tidak ada switch tidak valid atau tidak kompatibel dan tidak ada string pencarian melebihi batas panjang berlaku:0
ketika setidaknya satu kecocokan ditemukan dalam satu baris di seluruh file yang ditentukan;1
jika tidak;Garis dianggap mengandung kecocokan ketika:
/V
opsi yang diberikan dan ekspresi pencarian muncul setidaknya sekali;/V
opsi diberikan dan ekspresi pencarian tidak terjadi;Ini berarti bahwa
/V
opsi juga mengubah yang dikembalikanErrorLevel
, tetapi tidak hanya mengembalikannya!Sebagai contoh, ketika Anda sudah mendapat file
test.txt
dengan dua garis, salah satu yang berisi stringtext
tetapi yang lain tidak, baikfindstr "text" "test.txt"
danfindstr /V "text" "test.txt"
mengembalikanErrorLevel
dari0
.Pada dasarnya Anda dapat mengatakan: jika
findstr
mengembalikan paling tidak satu baris,ErrorLevel
diatur ke0
, yang lain menjadi1
.Perhatikan bahwa
/M
opsi tidak mempengaruhiErrorLevel
nilai, itu hanya mengubah output.(Hanya demi kelengkapan:
find
perintah berperilaku dengan cara yang persis sama sehubungan dengan/V
opsi danErrorLevel
;/C
opsi tidak mempengaruhiErrorLevel
.)sumber
FINDSTR memiliki bug warna yang saya gambarkan dan pecahkan di /superuser/1535810/is-there-a-better-way-to-mitigate-this-obscure-color-bug-when-piping-to -findstr / 1538802? noredirect = 1 # comment2339443_1538802
Untuk meringkas utas itu, bugnya adalah bahwa jika input disalurkan ke FINDSTR dalam blok kode yang diurung, sebaris kode warna ANSI escape, berhenti bekerja dalam perintah yang dieksekusi nanti. Contoh kode warna inline adalah:
echo %magenta%Alert: Something bad happened%yellow%
(di mana magenta dan kuning adalah vars yang didefinisikan sebelumnya dalam file .bat sebagai kode color escape ANSI yang sesuai).Solusi awal saya adalah memanggil subrutin do-nothing setelah FINDSTR. Entah bagaimana panggilan atau pengembalian "reset" apa pun yang perlu diatur ulang.
Kemudian saya menemukan solusi lain yang mungkin lebih efisien: tempatkan frasa FINDSTR di dalam tanda kurung, seperti dalam contoh berikut:
echo success | ( FINDSTR /R success )
Menempatkan frasa FINDSTR dalam blok kode bersarang tampaknya mengisolasi bug kode warna FINDSTR sehingga tidak akan mempengaruhi apa yang ada di luar sarang yang bersarang. blok. Mungkin teknik ini akan menyelesaikan beberapa efek samping FINDSTR yang tidak diinginkan juga .sumber
/ D tip untuk banyak direktori: letakkan daftar direktori Anda sebelum string pencarian. Ini semua bekerja:
Seperti yang diharapkan, jalur relatif ke lokasi jika Anda tidak memulai direktori
\
. Mengitari lintasan dengan"
adalah opsional jika tidak ada spasi dalam nama direktori. Penutupnya\
adalah opsional. Output dari lokasi akan mencakup jalur apa pun yang Anda berikan. Ini akan bekerja dengan atau tanpa mengelilingi daftar direktori"
.sumber
/D:dirlist Search a semicolon-delimited list of directories
dan ditempatkan sebelum string pencarian, jadi saya tidak mengerti apa sebenarnya yang "Anda temukan" tentang saklar / D (dan apa saja "perintah yang JANGAN bekerja ") ...findstr
daftar / D terlebih dahulu. Ya saya tidak punya argumen dengan fitur yang didokumentasikan, hanya saja tidak didokumentasikan tentang gotcha bahwa urutan atribut penting. Saya melakukan pekerjaan commandline sangat sedikit, jadi ketika saya membuat perintah, tidak menyadari urutan membuat perbedaan, saya hanya menambahkan atribut ketika saya mendapatkannya (dan secara alfabet, C mendahului D). Saya menjadi benar-benar frustrasi dan telah berbagi pengalaman "ditemukan" saya untuk siapa pun yang tidak banyak bekerja dengan commandline.findstr
dokumentasi menentukan bahwastrings
bagian ini tidak opsional dan bahwa Anda harus menempatkannya setelah opsional atribut dan sebelum opsional daftar nama file. Jika "Anda ditemukan" adalah bahwa menggunakan perintah tanpa mengikuti format penggunaannya menyebabkan kesalahan, maka titik tersebut didokumentasikan dengan baik. Lihat Perintah sintaks : "Sintaks muncul dalam urutan di mana Anda harus mengetik perintah dan parameter apa pun yang mengikutinya"