Prefazione
Molte delle informazioni contenute in questa risposta sono state raccolte sulla base di esperimenti condotti su una macchina Vista. Se non diversamente specificato, non ho confermato se le informazioni si applicano ad altre versioni di Windows.
Output FINDSTR
La documentazione non si preoccupa mai di spiegare l'output di FINDSTR. Allude al fatto che le linee corrispondenti sono stampate, ma niente di più.
Il formato dell'output della riga corrispondente è il seguente:
filename: lineNumber: lineOffset: il testo
dove
fileName: = il nome del file contenente la riga corrispondente. Il nome del file non viene stampato se la richiesta era esplicitamente per un singolo file o se si cercava l'input del pip o l'input reindirizzato. Quando viene stampato, il fileName includerà sempre tutte le informazioni sul percorso fornite. Ulteriori informazioni sul percorso verranno aggiunte se/S
si utilizzal'opzione. Il percorso stampato è sempre relativo al percorso fornito, o relativo alla directory corrente se non fornito.
Nota: il prefisso del nome file può essere evitato durante la ricerca di più file utilizzando i caratteri jolly non standard (e scarsamente documentati) <
e >
. Le regole esatte su come funzionano questi caratteri jolly sono disponibili qui . Infine, puoi vedere questo esempio di come funzionano i caratteri jolly non standard con FINDSTR .
lineNumber: = Il numero di riga della riga corrispondente rappresentata come valore decimale con 1 che rappresenta la 1a riga dell'input. Stampato solo se l'/N
opzione è specificata.
lineOffset: = Offset del byte decimale dell'inizio della riga corrispondente, con 0 che rappresenta il 1 ° carattere della 1a riga. Stampato solo se l'/O
opzione è specificata. Questo non èl'offset della corrispondenza all'interno della linea. È il numero di byte dall'inizio del file all'inizio della riga.
text = La rappresentazione binaria della linea corrispondente, inclusi eventuali <CR> e / o <LF>. Nulla viene lasciato fuori dall'output binario, in modo che questo esempio che corrisponda a tutte le righe produrrà una copia binaria esatta del file originale.
FINDSTR "^" FILE >FILE_COPY
L'opzione / A imposta il colore del fileName :, lineNumber: e lineOffset: solo output. Il testo della riga corrispondente viene sempre emesso con il colore corrente della console. L'opzione / A ha effetto solo quando l'output viene visualizzato direttamente sulla console. L'opzione / A non ha alcun effetto se l'output viene reindirizzato a un file o reindirizzato. Vedi la modifica 2018-08-18 nella risposta di Aacini per una descrizione del comportamento errato quando l'output viene reindirizzato a CON.
La maggior parte dei caratteri di controllo e molti caratteri ASCII estesi vengono visualizzati come punti su XP
FINDSTR su XP visualizza la maggior parte dei caratteri di controllo non stampabili dalle linee corrispondenti come punti (punti) sullo schermo. I seguenti caratteri di controllo sono eccezioni; vengono visualizzati come se stessi: scheda 0x09, avanzamento riga 0x0A, scheda verticale 0x0B, avanzamento modulo 0x0C, ritorno carrello 0x0D.
XP FINDSTR converte anche un numero di caratteri ASCII estesi in punti. I caratteri ASCII estesi che vengono visualizzati come punti su XP sono gli stessi di quelli che vengono trasformati quando vengono forniti sulla riga di comando. Vedi la sezione "Limiti di caratteri per i parametri della riga di comando - Trasformazione ASCII estesa" , più avanti in questo post
I caratteri di controllo e ASCII esteso non vengono convertiti in punti su XP se l'output viene reindirizzato, reindirizzato a un file o all'interno di una clausola FOR IN ().
Vista e Windows 7 mostrano sempre tutti i personaggi come se stessi, mai come punti.
Codici di ritorno (ERRORLEVEL)
- 0 (successo)
- La corrispondenza è stata trovata in almeno una riga di almeno un file.
- 1 (fallimento)
- Nessuna corrispondenza trovata in nessuna riga di alcun file.
- Colore non valido specificato
/A:xx
dall'opzione
- 2 (errore)
- Opzioni incompatibili
/L
ed /R
entrambe specificate
- Manca argomento dopo
/A:
, /F:
, /C:
, /D:
, o/G:
- File specificato da
/F:file
o /G:file
non trovato
- 255 (errore)
Origine dei dati da cercare (aggiornato in base ai test con Windows 7)
Findstr può cercare dati solo da una delle seguenti fonti:
nomi di file specificati come argomenti e / o usando l' /F:file
opzione.
stdin tramite reindirizzamento findstr "searchString" <file
flusso di dati da una pipe type file | findstr "searchString"
Argomenti / opzioni hanno la precedenza sul reindirizzamento, che ha la precedenza sui dati convogliati.
Argomenti del nome file e /F:file
possono essere combinati. È possibile utilizzare più argomenti per i nomi di file. Se /F:file
vengono specificate più opzioni, viene utilizzata solo l'ultima. I caratteri jolly sono consentiti negli argomenti del nome file, ma non all'interno del file a cui punta /F:file
.
Origine delle stringhe di ricerca (aggiornato in base ai test con Windows 7)
Le opzioni /G:file
e /C:string
possono essere combinate. /C:string
È possibile specificare più opzioni. Se /G:file
vengono specificate più opzioni, viene utilizzata solo l'ultima. Se si utilizza uno /G:file
o entrambi /C:string
, si presume che tutti gli argomenti non di opzione siano file da cercare. Se né /G:file
nor né /C:string
viene utilizzato, il primo argomento non opzione viene trattato come un elenco delimitato da spazi di termini di ricerca.
I nomi dei file non devono essere citati all'interno del file quando si utilizza l' /F:FILE
opzione.
I nomi dei file possono contenere spazi e altri caratteri speciali. La maggior parte dei comandi richiede che vengano citati tali nomi di file. Ma l' /F:files.txt
opzione FINDSTR richiede che i nomi dei file all'interno di files.txt NON debbano essere quotati. Il file non verrà trovato se il nome è citato.
ERRORE - I nomi di file 8.3 brevi possono interrompere le opzioni /D
e/S
Come per tutti i comandi di Windows, FINDSTR tenterà di far corrispondere sia il nome lungo che il nome breve 8.3 quando si cercano file da cercare. Supponiamo che la cartella corrente contenga i seguenti file non vuoti:
b1.txt
b.txt2
c.txt
Il seguente comando troverà correttamente tutti e 3 i file:
findstr /m "^" *.txt
b.txt2
corrisponde perché corrisponde il nome breve B9F64~1.TXT
corrispondente. Ciò è coerente con il comportamento di tutti gli altri comandi di Windows.
Ma un bug con le opzioni /D
e /S
fa sì che vengano trovati solo i seguenti comandib1.txt
findstr /m /d:. "^" *.txt
findstr /m /s "^" *.txt
Il bug impedisce b.txt2
di essere trovato, così come tutti i nomi di file che ordinano dopo b.txt2
all'interno della stessa directory. a.txt
Si trovano file aggiuntivi che prima ordinano, ad esempio . File aggiuntivi che vengono ordinati in seguito, come d.txt
, vengono persi una volta che il bug è stato attivato.
Ogni directory cercata viene trattata in modo indipendente. Ad esempio, l' /S
opzione inizierà a cercare correttamente in una cartella figlio dopo che non è stato possibile trovare i file nel genitore, ma una volta che il bug fa perdere un nome di file breve nel figlio, anche tutti i file successivi in quella cartella figlio mancherebbero .
I comandi funzionano senza errori se gli stessi nomi di file vengono creati su un computer in cui la generazione di nomi NTFS 8.3 è disabilitata. Naturalmente b.txt2
non sarebbe stato trovato, ma c.txt
sarebbe stato trovato correttamente.
Non tutti i nomi brevi attivano il bug. Tutte le istanze di comportamento errato che ho visto coinvolgono un'estensione più lunga di 3 caratteri con un breve nome 8.3 che inizia come un nome normale che non richiede un nome 8.3.
Il bug è stato confermato su XP, Vista e Windows 7.
Caratteri non stampabili e l' /P
opzione
L' /P
opzione fa sì che FINDSTR salti qualsiasi file contenente uno dei seguenti codici byte decimali:
0-7, 14-25, 27-31.
Detto in altro modo, l' /P
opzione salterà solo i file che contengono caratteri di controllo non stampabili. I caratteri di controllo sono codici inferiori o uguali a 31 (0x1F). FINDSTR tratta i seguenti caratteri di controllo come stampabili:
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)
Tutti gli altri caratteri di controllo vengono trattati come non stampabili, la cui presenza provoca l' /P
opzione per saltare il file.
È possibile che sia stato <CR><LF>
aggiunto input reindirizzato e reindirizzato
Se l'input è reindirizzato e l'ultimo carattere del flusso non lo è <LF>
, FINDSTR verrà automaticamente aggiunto <CR><LF>
all'input. Ciò è stato confermato su XP, Vista e Windows 7. (Pensavo che la pipe di Windows fosse responsabile della modifica dell'input, ma da allora ho scoperto che FINDSTR sta effettivamente facendo la modifica.)
Lo stesso vale per l'input reindirizzato su Vista. Se l'ultimo carattere di un file utilizzato come input reindirizzato non lo è <LF>
, FINDSTR si aggiungerà automaticamente <CR><LF>
all'input. Tuttavia, XP e Windows 7 non alterano l'input reindirizzato.
FINDSTR si blocca su XP e Windows 7 se l'input reindirizzato non termina con<LF>
Questa è una brutta "funzione" su XP e Windows 7. Se l'ultimo carattere di un file utilizzato come input reindirizzato non termina con <LF>
, FINDSTR si bloccherà indefinitamente una volta raggiunge la fine del file reindirizzato.
L'ultima riga di dati Piped può essere ignorata se è composta da un singolo carattere
Se l'input è reindirizzato e l'ultima riga è composta da un singolo carattere non seguito da <LF>
, FINDSTR ignora completamente l'ultima riga.
Esempio - Il primo comando con un singolo carattere e nessun <LF>
errore non corrisponde, ma il secondo comando con 2 caratteri funziona bene, così come il terzo comando che ha un carattere con la fine della nuova riga.
> set /p "=x" <nul | findstr "^"
> set /p "=xx" <nul | findstr "^"
xx
> echo x| findstr "^"
x
Segnalato dall'utente Sponge Belly di DosTips al nuovo bug findstr . Confermato su XP, Windows 7 e Windows 8. Non ho ancora sentito parlare di Vista. (Non ho più Vista da testare).
Sintassi delle
opzioni È possibile aggiungere un prefisso alle
opzioni /
oppure Le -
opzioni possono essere concatenate dopo una singola /
o -
. Tuttavia, l'elenco di opzioni concatenate può contenere al massimo un'opzione multi-carattere come OFF o F :, e l'opzione multi-carattere deve essere l'ultima opzione dell'elenco.
I seguenti sono tutti modi equivalenti di esprimere una ricerca regex insensibile al maiuscolo / minuscolo per qualsiasi riga che contenga sia "ciao" che "addio" in qualsiasi ordine
/i /r /c:"hello.*goodbye" /c:"goodbye.*hello"
-i -r -c:"hello.*goodbye" /c:"goodbye.*hello"
/irc:"hello.*goodbye" /c:"goodbye.*hello"
Limiti di lunghezza della stringa di ricerca
Su Vista la lunghezza massima consentita per una singola stringa di ricerca è 511 byte. Se una stringa di ricerca supera 511, il risultato è un FINDSTR: Search string too long.
errore con ERRORLEVEL 2.
Quando si esegue una ricerca di espressioni regolari, la lunghezza massima della stringa di ricerca è 254. Un'espressione regolare con lunghezza compresa tra 255 e 511 comporterà un FINDSTR: Out of memory
errore con ERRORLEVEL 2. Una lunghezza di espressione regolare> 511 determina l' FINDSTR: Search string too long.
errore.
Su Windows XP la lunghezza della stringa di ricerca è apparentemente più breve. Errore Findstr: "Cerca stringa troppo lunga": come estrarre e abbinare la sottostringa nel ciclo "for"?
Il limite di XP è di 127 byte per le ricerche letterali e regex.
Limiti di lunghezza della riga I
file specificati come argomento della riga di comando o tramite l'opzione / F: FILE non hanno limiti di lunghezza della riga noti. Le ricerche sono state eseguite correttamente su un file da 128 MB che non conteneva un singolo <LF>.
I dati in pipe e l'input reindirizzato sono limitati a 8191 byte per riga. Questo limite è una "caratteristica" di FINDSTR. Non è inerente alle pipe o al reindirizzamento. FINDSTR che utilizza lo stdin reindirizzato o l'input di piping non corrisponderà mai a nessuna riga che è> = 8k byte. Righe> = 8k generano un messaggio di errore per stderr, ma ERRORLEVEL è ancora 0 se la stringa di ricerca viene trovata in almeno una riga di almeno un file.
Tipo di ricerca predefinito: letterale vs espressione regolare
/C:"string"
- Il valore predefinito è / L letterale. Combinando esplicitamente l'opzione / L con / C: "stringa" sicuramente funziona ma è ridondante.
"string argument"
- L'impostazione predefinita dipende dal contenuto della prima stringa di ricerca. (Ricorda che <spazio> viene utilizzato per delimitare le stringhe di ricerca.) Se la prima stringa di ricerca è un'espressione regolare valida che contiene almeno un meta-carattere senza escape, tutte le stringhe di ricerca vengono trattate come espressioni regolari. In caso contrario, tutte le stringhe di ricerca vengono trattate come valori letterali. Ad esempio, "51.4 200"
verranno trattate come due espressioni regolari perché la prima stringa contiene un punto senza escape, mentre "200 51.4"
verranno trattate come due letterali perché la prima stringa non contiene alcun meta-carattere.
/G:file
- L'impostazione predefinita dipende dal contenuto della prima riga non vuota nel file. Se la prima stringa di ricerca è un'espressione regolare valida che contiene almeno un meta-carattere senza escape, tutte le stringhe di ricerca vengono trattate come espressioni regolari. In caso contrario, tutte le stringhe di ricerca vengono trattate come valori letterali.
Raccomandazione: specificare sempre esplicitamente /L
l'opzione letterale o /R
l'opzione di espressione regolare quando si utilizza "string argument"
o /G:file
.
ERRORE: la specifica di più stringhe di ricerca letterali può dare risultati inaffidabili
Il seguente semplice esempio FINDSTR non riesce a trovare una corrispondenza, anche se dovrebbe.
echo ffffaaa|findstr /l "ffffaaa faffaffddd"
Questo errore è stato confermato su Windows Server 2003, Windows XP, Vista e Windows 7.
Sulla base di esperimenti, FINDSTR potrebbe fallire se sono soddisfatte tutte le seguenti condizioni:
- La ricerca utilizza più stringhe di ricerca letterali
- Le stringhe di ricerca hanno lunghezze diverse
- Una stringa di ricerca breve ha una certa quantità di sovrapposizione con una stringa di ricerca più lunga
- La ricerca fa distinzione tra maiuscole e minuscole (nessuna
/I
opzione)
In ogni errore che ho visto, è sempre una delle stringhe di ricerca più brevi che non riesce.
Per maggiori informazioni vedi Perché questo esempio FINDSTR con più stringhe di ricerca letterali non trova una corrispondenza?
Citazioni e backslahses all'interno degli argomenti della riga di comando
Nota - I commenti dell'utente MC ND riflettono le attuali regole orribilmente complicate per questa sezione. Sono previste 3 distinte fasi di analisi:
- Il primo cmd.exe potrebbe richiedere l'escape di alcune virgolette come ^ "(davvero niente a che fare con FINDSTR)
- Il prossimo FINDSTR utilizza il parser di argomenti MS C / C ++ precedente al 2008 , che ha regole speciali per "e \
- Al termine dell'argomento parser, FINDSTR considera inoltre \ seguito da un carattere alfanumerico come letterale, ma \ seguito da un carattere non alfanumerico come carattere di escape
Il resto di questa sezione evidenziata non è corretto al 100%. Può servire come guida per molte situazioni, ma le regole di cui sopra sono necessarie per una comprensione totale.
Preventivo di
escape all'interno delle stringhe di ricerca della riga di comando Le virgolette all'interno delle stringhe di ricerca della riga di comando devono essere salvate con una barra rovesciata come
\"
. Questo è vero sia per le stringhe di ricerca letterale che regex. Queste informazioni sono state confermate su XP, Vista e Windows 7.
Nota: potrebbe essere necessario eseguire l'escape della citazione per il parser CMD.EXE, ma ciò non ha nulla a che fare con FINDSTR. Ad esempio, per cercare una singola citazione è possibile utilizzare:
FINDSTR \^" file && echo found || echo not found
Escaping della barra rovesciata all'interno delle stringhe di ricerca letterali della riga di comando La
barra rovesciata in una stringa di ricerca letterale può normalmente essere rappresentata come
\
o come \\
. Sono in genere equivalenti. (Ci possono essere casi insoliti in Vista in cui la barra rovesciata deve sempre essere sfuggita, ma non ho più una macchina Vista da testare) .
Ma ci sono alcuni casi speciali:
Quando si cercano barre rovesciate consecutive, è necessario sfuggire a tutti tranne l'ultimo . L'ultima barra rovesciata può facoltativamente essere salvata.
\\
può essere codificato come \\\
o\\\\
\\\
può essere codificato come \\\\\
o\\\\\\
La ricerca di una o più barre rovesciate prima di un preventivo è bizzarra. La logica suggerirebbe che il preventivo debba essere evitato e che ognuna delle barre rovesciate principali debba essere evasa, ma questo non funziona! Invece, ciascuna delle barre rovesciate principali deve essere doppiamente esclusa e la citazione viene evitata normalmente:
\"
deve essere codificato come \\\\\"
\\"
deve essere codificato come \\\\\\\\\"
Come notato in precedenza, una o più virgolette con escape possono richiedere anche la escape con ^
per il parser CMD
Le informazioni in questa sezione sono state confermate su XP e Windows 7.
Escaping della barra rovesciata all'interno delle stringhe di ricerca regex della riga di comando
Solo Vista: la barra rovesciata in una regex deve essere come doppia escape \\\\
, oppure come singola escape all'interno di una classe di caratteri impostata come
[\\]
XP e Windows 7: la barra rovesciata in una regex può sempre essere rappresentata come [\\]
. Normalmente può essere rappresentato come \\
. Ma questo non funziona mai se la barra rovesciata precede una citazione salvata.
Una o più barre rovesciate prima di una citazione con escape devono essere con doppio escape oppure devono essere codificate come [\\]
\"
può essere codificato come \\\\\"
o[\\]\"
\\"
può essere codificato come \\\\\\\\\"
o [\\][\\]\"
o\\[\\]\"
Virgolette di escape e barra rovesciata all'interno di / G: stringhe di ricerca letterali FILE Virgolette e
barre rovesciate all'interno di un file di stringa di ricerca letterale specificato da / G: il file non deve essere sottoposto a escape, ma possono esserlo.
"
e \"
sono equivalenti.
\
e \\
sono equivalenti.
Se l'intento è trovare \\, almeno la barra rovesciata iniziale deve essere sfuggita. Entrambi \\\
e \\\\
funzionano.
Se l'intento è trovare \ ", almeno la barra rovesciata principale deve essere sfuggita. Entrambi \\"
e \\\"
funzionano.
Quote di escape e barra rovesciata all'interno di / G: stringhe di ricerca regex FILE
Questo è il caso in cui le sequenze di escape funzionano come previsto in base alla documentazione. La citazione non è un metacarattere regex, quindi non deve essere evitato (ma può esserlo). La barra rovesciata è un metacarattere regex, quindi deve essere evitato.
Limiti di caratteri per i parametri della riga di comando - Trasformazione ASCII estesa
Il carattere null (0x00) non può apparire in nessuna stringa sulla riga di comando. Qualsiasi altro carattere a byte singolo può apparire nella stringa (0x01 - 0xFF). Tuttavia, FINDSTR converte molti caratteri ASCII estesi che trova all'interno dei parametri della riga di comando in altri caratteri. Ciò ha un impatto notevole in due modi:
1) Molti caratteri ASCII estesi non corrisponderanno a se stessi se utilizzati come stringa di ricerca nella riga di comando. Questa limitazione è la stessa per le ricerche letterali e regex. Se una stringa di ricerca deve contenere ASCII esteso, /G:FILE
utilizzare invece l' opzione.
2) FINDSTR potrebbe non riuscire a trovare un file se il nome contiene caratteri ASCII estesi e il nome del file è specificato nella riga di comando. Se un file da cercare contiene ASCII esteso nel nome, /F:FILE
è preferibile utilizzare l' opzione.
Ecco un elenco completo delle trasformazioni di caratteri ASCII estese che FINDSTR esegue sulle stringhe della riga di comando. Ogni carattere è rappresentato come valore decimale del codice byte. Il primo codice rappresenta il carattere come fornito sulla riga di comando e il secondo codice rappresenta il carattere in cui viene trasformato. Nota: questo elenco è stato compilato su una macchina americana. Non so quale impatto potrebbero avere altre lingue in questo elenco.
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
Qualsiasi carattere> 0 non presente nell'elenco precedente viene trattato come se stesso, inclusi <CR>
e < LF>
. Il modo più semplice per includere caratteri dispari come <CR>
ed <LF>
è inserirli in una variabile di ambiente e utilizzare l'espansione ritardata nell'argomento della riga di comando.
Limiti di caratteri per le stringhe trovati nei file specificati dalle opzioni / G: FILE e / F: FILE
Il carattere nul (0x00) può apparire nel file, ma funziona come il terminatore della stringa C. Tutti i caratteri dopo un carattere nul vengono trattati come una stringa diversa come se fossero su un'altra riga.
I caratteri <CR>
e <LF>
sono trattati come terminatori di riga che terminano una stringa e non sono inclusi nella stringa.
Tutti gli altri caratteri a byte singolo sono inclusi perfettamente in una stringa.
Ricerca di file Unicode
FINDSTR non può cercare correttamente la maggior parte degli Unicode (UTF-16, UTF-16LE, UTF-16BE, UTF-32) perché non è in grado di cercare nul byte e Unicode in genere contiene molti nul byte.
Tuttavia, il comando TYPE converte UTF-16LE con BOM in un set di caratteri a byte singolo, quindi un comando come il seguente funzionerà con UTF-16LE con BOM.
type unicode.txt|findstr "search"
Nota che i punti di codice Unicode che non sono supportati dalla tua tabella codici attiva verranno convertiti in ?
caratteri.
È possibile cercare UTF-8 purché la stringa di ricerca contenga solo ASCII. Tuttavia, l'output della console di qualsiasi carattere UTF-8 multi-byte non sarà corretto. Ma se si reindirizza l'output su un file, il risultato verrà codificato correttamente UTF-8. Si noti che se il file UTF-8 contiene una DBA, la DBA verrà considerata come parte della prima riga, che potrebbe annullare una ricerca che corrisponde all'inizio di una riga.
È possibile cercare caratteri UTF-8 multibyte se si inserisce la stringa di ricerca in un file di ricerca codificato UTF-8 (senza BOM) e si utilizza l'opzione / G.
Fine linea
FINDSTR interrompe le linee immediatamente dopo ogni <LF>. La presenza o l'assenza di <CR> non ha alcun impatto sulle interruzioni di linea.
Ricerca tra le interruzioni di riga
Come previsto, il .
metacarattere regex non corrisponderà a <CR> o <LF>. Ma è possibile cercare attraverso un'interruzione di riga usando una stringa di ricerca della riga di comando. Entrambi i caratteri <CR> e <LF> devono essere abbinati esplicitamente. Se viene trovata una corrispondenza su più righe, viene stampata solo la prima riga della corrispondenza. FINDSTR quindi raddoppia alla seconda riga nella sorgente e ricomincia la ricerca da capo - una sorta di funzione di tipo "guarda avanti".
Supponiamo che TEXT.TXT abbia questi contenuti (potrebbe essere in stile Unix o Windows)
A
A
A
B
A
A
Quindi questa sceneggiatura
@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
dà questi risultati
1:A
2:A
5:A
La ricerca tra le interruzioni di riga utilizzando l'opzione / G: FILE è imprecisa perché l'unico modo per abbinare <CR> o <LF> è tramite un'espressione di intervallo di classi di caratteri regex che inserisce i caratteri EOL.
[<TAB>-<0x0B>]
corrisponde a <LF>, ma corrisponde anche a <TAB> e <0x0B>
[<0x0C>-!]
corrisponde a <CR>, ma corrisponde anche a <0x0C> e!
Nota: quanto sopra sono rappresentazioni simboliche del flusso di byte regex poiché non riesco a rappresentare graficamente i caratteri.
Risposta continua nella parte 2 di seguito ...
grep
che è molto ben compreso e documentato :-) Vedi stackoverflow.com/questions/2635740/… per esempio.