Önsöz Bu yanıttaki bilgilerin
çoğu, bir Vista makinesinde yapılan deneylere dayanarak toplanmıştır. Aksi açıkça belirtilmedikçe, bilgilerin diğer Windows sürümleri için geçerli olup olmadığını onaylamadım.
FINDSTR çıktısı
Doküman asla FINDSTR çıktısını açıklamaktan rahatsız olmaz. Eşleşen çizgilerin basıldığı gerçeğini ifade eder, ancak başka bir şey değildir.
Eşleşen hat çıktısının biçimi aşağıdaki gibidir:
Dosya adı: LineNumber: lineOffset: Metin
nerede
fileName: = Eşleşen satırı içeren dosyanın adı. İstek açıkça tek bir dosya içinse veya borulu giriş veya yeniden yönlendirilmiş giriş aranıyorsa dosya adı yazdırılmaz. Basıldığında, fileName her zaman sağlanan yol bilgilerini içerir. /S
Seçenek kullanılırsaek yol bilgileri eklenir. Yazdırılan yol her zaman sağlanan yola göredir veya sağlanmamışsa geçerli dizine göredir.
Not - kullanarak birden çok dosya ararken dosya öneki önlenebilir standart dışı (ve kötü belgelenmiş) joker <
ve >
. Bu joker karakterlerin nasıl çalıştığına ilişkin kesin kuralları burada bulabilirsiniz . Son olarak, standart olmayan joker karakterlerin FINDSTR ile nasıl çalıştığına dair bu örneğe bakabilirsiniz .
lineNumber: = Eşleşen satırın ondalık değer olarak temsil edilen satır numarası, 1 girişin 1. satırını temsil eder. Yalnızca/N
seçenek belirtilirseyazdırılır.
lineOffset: = Eşleme satırının başlangıcındaki ondalık bayt uzaklığı, 0 1. satırın 1. karakterini temsil eder. Yalnızca/O
seçenek belirtilirseyazdırılır. Bu,çizgideki eşleşmenin ofseti değildir . Dosyanın başından satırın başına kadar olan bayt sayısıdır.
text = Herhangi bir <CR> ve / veya <LF> dahil olmak üzere eşleşen satırın ikili gösterimi. İkili çıktıda hiçbir şey kalmaz, böylece tüm satırlarla eşleşen bu örnek orijinal dosyanın tam bir ikili kopyasını oluşturur.
FINDSTR "^" FILE >FILE_COPY
/ A seçeneği yalnızca fileName :, lineNumber: ve lineOffset: output'un rengini ayarlar. Eşleşen satırın metni her zaman geçerli konsol rengiyle çıkarılır. / A seçeneği yalnızca çıktı doğrudan konsola görüntülendiğinde etkili olur. Çıktı bir dosyaya yönlendirilirse veya iletilirse, / A seçeneğinin bir etkisi yoktur. Çıktı CON'a yönlendirildiğinde hata ayıklama davranışının açıklaması için Aacini'nin cevabındaki 2018-08-18 düzenlemesine bakın .
Çoğu kontrol karakteri ve birçok genişletilmiş ASCII karakteri XP'de noktalar olarak görüntülenir XP'de
FINDSTR, yazdırılamayan kontrol karakterlerinin çoğunu, eşleşen satırlardan ekranda noktalar (nokta) olarak görüntüler. Aşağıdaki kontrol karakterleri istisnadır; kendileri gibi görünürler: 0x09 Sekmesi, 0x0A LineFeed, 0x0B Dikey Sekmesi, 0x0C Form Beslemesi, 0x0D Satır Başı.
XP FINDSTR ayrıca bir dizi genişletilmiş ASCII karakterini noktalara dönüştürür. XP'de nokta olarak görüntülenen genişletilmiş ASCII karakterleri, komut satırında sağlandığında dönüştürülen karakterlerle aynıdır. Bu yazının ilerisindeki "Komut satırı parametreleri için karakter sınırları - Genişletilmiş ASCII dönüşümü" bölümüne bakın.
Çıktı pipetlenirse, bir dosyaya yeniden yönlendirilirse veya bir FOR IN () yantümcesi içinde ise denetim karakterleri ve genişletilmiş ASCII, XP'deki noktalara dönüştürülmez.
Vista ve Windows 7 her zaman tüm karakterleri kendileri gibi gösterir, asla nokta olarak göstermez.
Dönüş Kodları (ERRORLEVEL)
- 0 (başarı)
- Eşleşme, en az bir dosyanın en az bir satırında bulundu.
- 1 (hata)
- Hiçbir dosyanın hiçbir satırında eşleşme bulunamadı.
/A:xx
Seçenek tarafından geçersiz renk belirtildi
- 2 (hata)
- Uyumsuz seçenekler
/L
ve /R
her ikisi de belirtildi
- Eksik argüman sonra
/A:
, /F:
, /C:
, /D:
, veya/G:
- Tarafından belirtilen
/F:file
veya /G:file
bulunamadı dosya
- 255 (hata)
Aranacak verilerin kaynağı ( Windows 7 ile yapılan testlere göre güncellenmiştir)
Findstr, aşağıdaki kaynaklardan yalnızca birinden veri arayabilir:
argüman olarak belirtilen ve / veya /F:file
seçeneği kullanan dosya adları .
yönlendirme yoluyla stdin findstr "searchString" <file
borudan veri akışı type file | findstr "searchString"
Bağımsız değişkenler / seçenekler, yönlendirilen verilere göre yeniden yönlendirmeye göre önceliklidir.
Dosya adı bağımsız değişkenleri ve /F:file
birleştirilebilir. Birden çok dosya adı bağımsız değişkeni kullanılabilir. Birden fazla /F:file
seçenek belirtilirse, yalnızca son seçenek kullanılır. Dosya adı bağımsız değişkenlerinde joker karakterlere izin verilir, ancak işaret ettiği dosyada izin verilmez /F:file
.
Arama dizeleri Kaynak (Windows 7 ile testlere dayanarak Updated) ve seçenekler birleştirilebilir. Birden fazla seçenek belirtilebilir. Birden fazla seçenek belirtilirse, yalnızca son seçenek kullanılır. Ya da kullanılırsa, seçenek olmayan tüm bağımsız değişkenlerin aranacak dosyalar olduğu varsayılır. Ne kullanılmaz ne de kullanılırsa, ilk seçenek olmayan argüman, boşlukla sınırlandırılmış arama terimleri listesi olarak kabul edilir.
/G:file
/C:string
/C:string
/G:file
/G:file
/C:string
/G:file
/C:string
Bu /F:FILE
seçenek kullanılırken dosya adları dosya içinde belirtilmemelidir .
Dosya adları boşluklar ve diğer özel karakterler içerebilir. Çoğu komut bu tür dosya adlarının alıntılanmasını gerektirir. Ancak FINDSTR /F:files.txt
seçeneği, files.txt içindeki dosya adlarının tırnak içine alınmamasını gerektirir. Ad belirtilirse dosya bulunmaz.
HATA - Kısa 8.3 dosya adları /D
ve /S
seçenekleri kırabilir
Tüm Windows komutlarında olduğu gibi, FINDSTR aranacak dosyaları ararken hem uzun adı hem de kısa 8.3 adını eşleştirmeye çalışır. Geçerli klasörün aşağıdaki boş olmayan dosyaları içerdiğini varsayın:
b1.txt
b.txt2
c.txt
Aşağıdaki komut 3 dosyanın tümünü başarıyla bulur:
findstr /m "^" *.txt
b.txt2
karşılık gelen kısa ad B9F64~1.TXT
eşleştiğinden eşleşir. Bu, diğer tüm Windows komutlarının davranışlarıyla tutarlıdır.
Ancak /D
ve /S
seçenekleriyle ilgili bir hata , aşağıdaki komutların yalnızcab1.txt
findstr /m /d:. "^" *.txt
findstr /m /s "^" *.txt
Hata , aynı dizinde b.txt2
sıralanan tüm dosya adlarının yanı sıra bulunmasını engeller b.txt2
. Daha önce sıralama gibi ek dosyalar a.txt
bulunur. Daha sonra d.txt
sıralanan ek dosyalar , hata tetiklendikten sonra kaçırılır.
Aranan her dizin bağımsız olarak ele alınır. Örneğin, /S
seçenek üst dosyadaki dosyaları bulamadan sonra bir alt klasörde başarıyla aramaya başlar, ancak hata alt öğede kısa bir dosya adının kaçırılmasına neden olduğunda, o alt klasördeki sonraki tüm dosyalar da kaçırılır .
NTFS 8.3 ad oluşturma devre dışı bırakılmış bir makinede aynı dosya adları oluşturulursa, komutlar hatasız çalışır. Tabii ki b.txt2
bulunamadı, ama c.txt
düzgün bulunacaktı.
Kısa adların tümü hatayı tetiklemez. Gördüğüm tüm hata davranışları, 8.3 adı gerektirmeyen normal bir adla aynı başlayan kısa bir 8.3 adıyla 3 karakterden daha uzun bir uzantı içerir.
Hata XP, Vista ve Windows 7'de onaylandı.
Yazdırılamayan karakterler ve /P
seçenek
Bu /P
seçenek, FINDSTR'un aşağıdaki ondalık bayt kodlarından herhangi birini içeren herhangi bir dosyayı atlamasına neden olur:
0-7, 14-25, 27-31.
Başka bir deyişle, /P
seçenek yalnızca yazdırılamayan kontrol karakterleri içeren dosyaları atlayacaktır. Kontrol karakterleri 31 (0x1F) veya daha küçük kodlardır. FINDSTR aşağıdaki kontrol karakterlerini yazdırılabilir olarak kabul eder:
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)
Diğer tüm kontrol karakterleri yazdırılamaz olarak kabul edilir, bu da varlığı /P
dosyayı atlama seçeneğine neden olur .
Borulu ve<CR><LF>
Yeniden Yönlendirilmiş giriş eklenmiş olabilir Giriş içeri aktarılırsa ve akışın son karakteri değilse <LF>
, FINDSTR otomatik olarak <CR><LF>
girdiye eklenir . Bu, XP, Vista ve Windows 7'de onaylandı. (Windows borusunun girdiyi değiştirmekle sorumlu olduğunu düşünürdüm, ancak o zamandan beri FINDSTR'ın aslında değişikliği yaptığını keşfettim.)
Aynı şey Vista'daki yeniden yönlendirilmiş giriş için de geçerlidir. Yeniden yönlendirilmiş giriş olarak kullanılan bir dosyanın son karakteri değilse <LF>
, FINDSTR otomatik olarak <CR><LF>
girişe eklenir . Ancak, XP ve Windows 7 yeniden yönlendirilen girişi değiştirmez.
Yeniden yönlendirilen giriş ile bitmezse FINDSTR XP ve Windows 7'de kilitleniyor Bu, XP ve Windows 7'de<LF>
kötü bir "özellik" ise, Yeniden yönlendirilmiş giriş olarak kullanılan bir dosyanın son karakteri <LF>
bitmezse, FINDSTR süresiz olarak kilitlenir yeniden yönlendirilen dosyanın sonuna ulaşır.
Borulu verilerin son satırı, tek bir karakterden oluşuyorsa yok sayılabilir
. Giriş <LF>
içeri aktarılırsa ve son satırı takip edilmeyen tek bir karakterden oluşuyorsa, FINDSTR son satırı tamamen yok sayar.
Örnek - Tek bir karaktere sahip olan ve hiçbir <LF>
karakter içermeyen ilk komut eşleşemez, ancak 2 karakterli ikinci komut, son satırsonu karakteri olan bir karaktere sahip üçüncü komutta olduğu gibi iyi çalışır.
> set /p "=x" <nul | findstr "^"
> set /p "=xx" <nul | findstr "^"
xx
> echo x| findstr "^"
x
DosTips kullanıcısı Sünger Göbek tarafından yeni findstr hatasıyla bildirildi . XP, Windows 7 ve Windows 8'de onaylandı. Vista hakkında henüz bir şey duymadım. (Artık test edeceğim Vista yok).
Seçenek sözdizimi
Seçeneklerin herhangi biri ile öneki
olabilir /
veya -
Seçenekler tek bir /
veya sonra birleştirilebilir -
. Ancak, birleştirilmiş seçenek listesi, OFF veya F: gibi en fazla bir çok karakterli seçenek içerebilir ve çok karakterli seçenek listedeki son seçenek olmalıdır.
Aşağıdakilerin tümü, herhangi bir sırada hem "merhaba" hem de "güle güle" içeren herhangi bir satır için büyük / küçük harfe duyarlı olmayan normal ifade aramasını ifade etmenin eşdeğer yollarıdır.
/i /r /c:"hello.*goodbye" /c:"goodbye.*hello"
-i -r -c:"hello.*goodbye" /c:"goodbye.*hello"
/irc:"hello.*goodbye" /c:"goodbye.*hello"
Arama Dizesi uzunluk sınırları
Vista'da tek bir arama dizesi için izin verilen maksimum uzunluk 511 bayttır. Herhangi bir arama dizesi 511'i aşarsa, sonuç FINDSTR: Search string too long.
ERRORLEVEL 2 ile ilgili bir hatadır.
Normal bir ifade araması yaparken, maksimum arama dizesi uzunluğu 254'tür. 255 ile 511 arasında bir FINDSTR: Out of memory
uzunluğa sahip normal bir ifade, ERRORLEVEL 2 ile ilgili bir hatayla sonuçlanacaktır FINDSTR: Search string too long.
.
Windows XP'de arama dizesi uzunluğu açıkça daha kısadır. Findstr hatası: "Arama dizesi çok uzun": "for" döngüsünde alt dize nasıl ayıklanır ve eşleştirilir?
XP sınırı, hem değişmez hem de normal ifade aramaları için 127 bayttır.
Satır Uzunluğu sınırları
Komut satırı bağımsız değişkeni olarak veya / F: FILE seçeneği ile belirtilen dosyaların bilinen bir satır uzunluğu sınırı yoktur. Aramalar tek bir <LF> içermeyen 128 MB'lık bir dosyada başarıyla gerçekleştirildi.
Borulu veriler ve Yönlendirilen giriş hat başına 8191 bayt ile sınırlıdır. Bu sınır FINDSTR'ın bir "özelliğidir". Borular veya yönlendirme için doğal değildir. Yeniden yönlendirilmiş standart veya borulu giriş kullanan FINDSTR, hiçbir zaman> = 8k bayt olan herhangi bir satırla eşleşmez. Çizgiler> = 8k stderr'a bir hata mesajı oluşturur, ancak arama dizesi en az bir dosyanın en az bir satırında bulunursa ERRORLEVEL hala 0'dır.
Varsayılan arama türü: Değişmez ve Normal İfade
/C:"string"
- Varsayılan / L değişmez değeridir. / L seçeneğini / C: "string" ile açıkça birleştirmek kesinlikle işe yarar ama gereksizdir.
"string argument"
- Varsayılan, ilk arama dizesinin içeriğine bağlıdır. (<space> öğesinin arama dizelerini sınırlamak için kullanıldığını unutmayın.) İlk arama dizesi, en az bir çıkış karakteri bulunmayan meta karakter içeren geçerli bir normal ifadeyse, tüm arama dizeleri normal ifadeler olarak kabul edilir. Aksi takdirde, tüm arama dizeleri değişmez olarak kabul edilir. Örneğin "51.4 200"
, ilk dize kaçan bir nokta içerdiğinden iki normal ifade "200 51.4"
olarak ele alınırken, ilk dize herhangi bir meta karakter içermediğinden iki değişmez olarak ele alınacaktır.
/G:file
- Varsayılan, dosyadaki ilk boş olmayan satırın içeriğine bağlıdır. İlk arama dizesi, en az bir çıkış karakteri bulunmayan meta karakter içeren geçerli bir normal ifadeyse, tüm arama dizeleri normal ifadeler olarak kabul edilir. Aksi takdirde, tüm arama dizeleri değişmez olarak kabul edilir.
Öneri - Her zaman açıkça belirtmek /L
literal seçeneği veya /R
kullanırken düzenli ifade seçeneğini "string argument"
veya /G:file
.
HATA - Birden çok değişmez arama dizesi belirtmek güvenilir olmayan sonuçlar verebilir
Aşağıdaki basit FINDSTR örneği, bir eşleşme bulamamasına rağmen başarısız oluyor.
echo ffffaaa|findstr /l "ffffaaa faffaffddd"
Bu hata Windows Server 2003, Windows XP, Vista ve Windows 7'de onaylanmıştır.
Deneylere dayanarak, aşağıdaki koşulların tümü yerine getirilirse FINDSTR başarısız olabilir:
- Arama birden çok değişmez arama dizesi kullanıyor
- Arama dizeleri farklı uzunluklarda
- Kısa bir arama dizesinde, daha uzun bir arama dizesiyle bir miktar çakışma vardır
- Arama büyük / küçük harfe duyarlıdır (
/I
seçenek yok )
Gördüğüm her hatada, her zaman başarısız olan kısa arama dizelerinden biridir.
Daha fazla bilgi için bkz. Birden çok değişmez arama dizesine sahip bu FINDSTR örneği neden bir eşleşme bulamıyor?
Komut satırı bağımsız değişkenleri içindeki tırnak işaretleri ve ters hatalar
Not - Kullanıcı MC ND'nin yorumları, bu bölüm için korkunç derecede karmaşık kuralları yansıtır. 3 ayrı ayrıştırma aşaması söz konusudur:
- İlk cmd.exe bazı tırnakların ^ "olarak kaçmasını gerektirebilir (FINDSTR ile gerçekten ilgisi yoktur)
- Sonraki FINDSTR, "ve \ için özel kurallara sahip olan 2008 öncesi MS C / C ++ bağımsız değişken ayrıştırıcısını kullanır
- Bağımsız değişken ayrıştırıcısı bittikten sonra, FINDSTR \ 'karakterini ek olarak \ ve ardından alfa-sayısal karakteri değişmez, \ \ ve ardından alfa-sayısal olmayan karakteri çıkış karakteri olarak ele alır
Vurgulanan bu bölümün geri kalanı% 100 doğru değil. Birçok durum için bir rehber görevi görebilir, ancak toplam kurallar için yukarıdaki kurallar gereklidir.
Komut satırı arama dizeleri içinde Alıntı Yapma Komut satırı arama dizeleri
içindeki alıntılar ters eğik çizgi ile kaçmalıdır
\"
. Bu hem değişmez hem de normal ifade arama dizeleri için geçerlidir. Bu bilgiler XP, Vista ve Windows 7'de onaylanmıştır.
Not: Alıntı CMD.EXE ayrıştırıcı için de kaçması gerekebilir, ancak bunun FINDSTR ile ilgisi yoktur. Örneğin, tek bir fiyat teklifi aramak için şunları kullanabilirsiniz:
FINDSTR \^" file && echo found || echo not found
Komut satırı değişmez arama dizeleri içinde
Ters Eğik Çizgi'den kaçınma Değişmez arama dizesindeki ters eğik çizgi normal olarak \
veya olarak temsil
edilebilir \\
. Bunlar tipik olarak eşdeğerdir. (Vista'da ters eğik çizginin her zaman kaçması gereken olağandışı durumlar olabilir, ancak artık test etmek için bir Vista makinem yok) .
Ancak bazı özel durumlar var:
Ardışık ters eğik ararken, tüm ama son zorunluluk öncelenmelidir. Son ters eğik çizgi isteğe bağlı olarak kaçabilir.
\\
olarak kodlanabilir \\\
ya da\\\\
\\\
olarak kodlanabilir \\\\\
ya da\\\\\\
Bir tekliften önce bir veya daha fazla ters eğik çizgi aramak tuhaftır. Mantık, alıntıdan kaçılması gerektiğini ve önde gelen ters eğik çizgilerin her birinin kaçması gerektiğini önerecektir, ancak bu işe yaramaz! Bunun yerine, önde gelen ters eğik çizgilerin her biri iki kez kaçmalı ve teklif normal şekilde kaçmalıdır:
\"
olarak kodlanmalıdır \\\\\"
\\"
olarak kodlanmalıdır \\\\\\\\\"
Daha önce belirtildiği gibi, bir veya daha fazla kaçan tırnak ^
CMD ayrıştırıcısı için kaçmayı da gerektirebilir
Bu bölümdeki bilgiler XP ve Windows 7'de onaylanmıştır.
Komut satırı normal ifade arama dizelerinde Ters Eğik Çizgi'den kaçma
Yalnızca Vista: Normal ifadedeki ters eğik çizgi, ya çift \\\\
karakterden kaçmalı ya da başka bir karakter sınıfı kümesinden tek çıkış karakterli olmalıdır
[\\]
XP ve Windows 7: Bir normal ifadedeki ters eğik çizgi her zaman olarak temsil edilebilir [\\]
. Normalde olarak temsil edilebilir \\
. Ancak, ters eğik çizgi kaçan bir alıntıdan önce gelirse bu asla işe yaramaz.
Kaçan bir alıntıdan önce bir veya daha fazla ters eğik çizgi çift kaçış veya başka bir şekilde kodlanmış olmalıdır [\\]
\"
gibi kodlanmış olabilir \\\\\"
ya da[\\]\"
\\"
gibi kodlanmış olabilir \\\\\\\\\"
ya da [\\][\\]\"
ya da\\[\\]\"
/ G: FILE değişmez arama dizeleri içinde Alıntı ve Ters Eğik Çizgi'ten kaçınma / G:
dosyası ile belirtilen değişmez bir arama dizesi dosyasındaki bağımsız tırnak işaretleri ve ters eğik çizgilerden kaçınılması gerekmez, ancak olabilirler.
"
ve \"
eşdeğerdir.
\
ve \\
eşdeğerdir.
Amaç \\ bulmaksa, en azından önde gelen ters eğik çizgiden kaçılmalıdır. Hem \\\
ve \\\\
çalışması.
Niyet "\ bulmak ise, o zaman en azından baştaki ters şekilde çıkmalıdır. Hem \\"
ve \\\"
işi.
/ G: FILE regex arama dizeleri içinde Alıntı ve Ters Eğik Çizgi'ten kaçış
Bu, kaçış dizilerinin belgelere dayanarak beklendiği gibi çalıştığı tek durumdur. Alıntı bir regex metakarakter değildir, bu yüzden kaçmasına gerek yoktur (ama olabilir). Ters eğik çizgi normal ifade metakarakteridir, bu yüzden kaçmak gerekir.
Komut satırı parametreleri için karakter sınırları - Genişletilmiş ASCII dönüşümü
Boş karakter (0x00), komut satırındaki hiçbir dizede görünemez. Dizede başka herhangi bir tek bayt karakteri görünebilir (0x01 - 0xFF). Ancak FINDSTR, komut satırı parametreleri içinde bulduğu birçok genişletilmiş ASCII karakterini diğer karakterlere dönüştürür. Bunun iki şekilde büyük bir etkisi vardır:
1) Komut satırında arama dizesi olarak kullanılırsa, birçok genişletilmiş ASCII karakteri eşleşmez. Bu sınırlama, değişmez ve normal ifade aramaları için aynıdır. Bir arama dizesi genişletilmiş ASCII içermesi gerekiyorsa, /G:FILE
bunun yerine seçenek kullanılmalıdır.
2) Ad genişletilmiş ASCII karakterleri içeriyorsa ve dosya adı komut satırında belirtilmişse, FINDSTR dosya bulamayabilir. Aranacak bir dosya adında genişletilmiş ASCII içeriyorsa, /F:FILE
bunun yerine seçenek kullanılmalıdır.
FINDSTR'ın komut satırı dizelerinde gerçekleştirdiği genişletilmiş ASCII karakter dönüşümlerinin tam listesi. Her karakter ondalık bayt kod değeri olarak temsil edilir. İlk kod, komut satırında sağlanan karakteri ve ikinci kod dönüştürüldüğü karakteri temsil eder. Not - bu liste bir ABD makinesinde derlenmiştir. Diğer dillerin bu listede ne gibi etkileri olabileceğini bilmiyorum.
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
Yukarıdaki listede olmayan> 0 karakteri <CR>
ve < dahil olmak üzere kendisi olarak kabul edilir LF>
. En kolay yolu gibi tuhaf karakterleri içerecek şekilde <CR>
ve <LF>
çevre değişkene onları almak ve komut satırı argümanı içinde gecikmeli genişleme kullanmaktır.
/ G: FILE ve / F: FILE seçenekleri tarafından belirtilen dosyalarda bulunan dizeler için karakter sınırları
Nul (0x00) karakteri dosyada görünebilir, ancak C dizesi sonlandırıcısı gibi çalışır. Bir boş karakterden sonraki tüm karakterler, başka bir satırdaymış gibi farklı bir dize olarak ele alınır.
<CR>
Ve <LF>
karakterler bir dize sonlandırmak ve dizede yer almayan satır sonlandırıcı olarak kabul edilir.
Diğer tüm tek bayt karakterler bir dizeye mükemmel şekilde dahil edilir.
Unicode dosyalarında
arama FINDSTR, nul baytları arayamayacağından ve Unicode genellikle çok sayıda nul bayt içerdiğinden çoğu Unicode'u (UTF-16, UTF-16LE, UTF-16BE, UTF-32) düzgün bir şekilde arayamaz.
Ancak, TYPE komutu BOM ile UTF-16LE'yi tek baytlık karakter kümesine dönüştürür, bu nedenle aşağıdaki gibi bir komut BOM ile UTF-16LE ile çalışır.
type unicode.txt|findstr "search"
Etkin kod sayfanız tarafından desteklenmeyen Unicode kod noktalarının ?
karakterlere dönüştürüleceğini unutmayın .
Arama dizeniz yalnızca ASCII içerdiği sürece UTF-8'i aramak mümkündür. Ancak, çok baytlık UTF-8 karakterlerinin konsol çıktıları doğru olmaz. Ancak çıktıyı bir dosyaya yönlendirirseniz, sonuç UTF-8'i doğru şekilde kodlar. UTF-8 dosyası bir Malzeme Listesini içeriyorsa, Malzeme Listesinin ilk satırın bir parçası olarak kabul edileceğini ve bu satırın başlangıcıyla eşleşen bir aramayı başlatabileceğini unutmayın.
Arama dizenizi UTF-8 kodlu bir arama dosyasına (BOM'suz) koyarsanız ve / G seçeneğini kullanırsanız çok baytlık UTF-8 karakterlerini aramak mümkündür.
Satır Sonu
FINDSTR, her <LF> 'den hemen sonra satırları keser. <CR> 'nin varlığı veya yokluğunun satır kesmeleri üzerinde hiçbir etkisi yoktur.
Satır sonlarında arama
Beklendiği gibi .
normal ifade meta karakteri <CR> veya <LF> ile eşleşmeyecek. Ancak bir komut satırı arama dizesi kullanarak satır sonu arasında arama yapmak mümkündür. Hem <CR> hem de <LF> karakterleri açıkça eşleştirilmelidir. Çok satırlı bir eşleşme bulunursa, maçın yalnızca 1. satırı yazdırılır. FINDSTR daha sonra kaynaktaki 2. satıra iki katına çıkar ve aramaya tekrar başlar - bir tür "ileriye bak" tipi özellik.
TEXT.TXT'in bu içeriğe sahip olduğunu varsayın (Unix veya Windows tarzı olabilir)
A
A
A
B
A
A
Sonra bu senaryo
@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
bu sonuçları verir
1:A
2:A
5:A
/CR: FILE seçeneğini kullanarak satır sonlarında arama yapmak kesin değildir çünkü <CR> veya <LF> ile eşleşmenin tek yolu EOL karakterlerini sandviçleyen normal ifade karakter sınıfı aralık ifadesidir.
[<TAB>-<0x0B>]
<LF> ile eşleşir, ancak <TAB> ve <0x0B> ile de eşleşir
[<0x0C>-!]
<CR> ile eşleşir, ancak <0x0C> ve!
Not - yukarıdaki karakterleri grafik olarak temsil edemiyorum çünkü regex bayt akışının sembolik gösterimleridir.
Aşağıdaki bölüm 2'de cevap devam etti ...
grep