Prefacio
Gran parte de la información de esta respuesta se ha recopilado en base a experimentos realizados en una máquina Vista. A menos que se indique explícitamente lo contrario, no he confirmado si la información se aplica a otras versiones de Windows.
Salida FINDSTR
La documentación nunca se molesta en explicar la salida de FINDSTR. Alude al hecho de que se imprimen líneas coincidentes, pero nada más.
El formato de salida de línea coincidente es el siguiente:
filename: lineNumber: lineOffset: text
dónde
nombre del archivo: = El nombre del archivo que contiene la línea coincidente. El nombre del archivo no se imprime si la solicitud fue explícitamente para un solo archivo, o si se busca una entrada canalizada o una entrada redirigida. Cuando se imprime, el nombre del archivo siempre incluirá cualquier información de ruta proporcionada. Se agregará información de ruta adicional si /S
se utiliza la opción. La ruta impresa siempre es relativa a la ruta proporcionada, o relativa al directorio actual si no se proporciona ninguno.
Nota - El prefijo de nombre de archivo se puede evitar cuando se busca varios archivos mediante el uso de la no-estándar (y mal documentados) comodines <
y >
. Las reglas exactas sobre cómo funcionan estos comodines se pueden encontrar aquí . Finalmente, puede ver este ejemplo de cómo funcionan los comodines no estándar con FINDSTR .
lineNumber: = El número de línea de la línea coincidente representada como un valor decimal con 1 que representa la primera línea de la entrada. Solo se imprime si/N
se especifica la opción.
lineOffset: = El desplazamiento del byte decimal del inicio de la línea coincidente, donde 0 representa el primer carácter de la primera línea. Solo se imprime si/O
se especifica la opción. Este no esel desplazamiento de la coincidencia dentro de la línea. Es el número de bytes desde el comienzo del archivo hasta el comienzo de la línea.
text = La representación binaria de la línea coincidente, incluidos <CR> y / o <LF>. No queda nada fuera de la salida binaria, de modo que este ejemplo que coincida con todas las líneas producirá una copia binaria exacta del archivo original.
FINDSTR "^" FILE >FILE_COPY
La opción / A establece el color del fileName :, lineNumber :, y lineOffset: solo salida. El texto de la línea coincidente siempre sale con el color de la consola actual. La opción / A solo tiene efecto cuando la salida se muestra directamente en la consola. La opción / A no tiene efecto si la salida se redirige a un archivo o se canaliza. Consulte la edición de 2018-08-18 en la respuesta de Aacini para obtener una descripción del comportamiento defectuoso cuando la salida se redirige a CON.
La mayoría de los caracteres de control y muchos caracteres ASCII extendidos se muestran como puntos en XP
FINDSTR en XP muestra la mayoría de los caracteres de control no imprimibles de líneas coincidentes como puntos (puntos) en la pantalla. Los siguientes caracteres de control son excepciones; se muestran como ellos mismos: 0x09 Tabulación, 0x0A LineFeed, 0x0B Vertical Tab, 0x0C Form Feed, 0x0D Carriage Return.
XP FINDSTR también convierte una cantidad de caracteres ASCII extendidos en puntos también. Los caracteres ASCII extendidos que se muestran como puntos en XP son los mismos que se transforman cuando se proporcionan en la línea de comandos. Consulte la sección "Límites de caracteres para los parámetros de la línea de comandos: transformación ASCII extendida" , más adelante en esta publicación
Los caracteres de control y ASCII extendido no se convierten en puntos en XP si la salida se canaliza, se redirige a un archivo o dentro de una cláusula FOR IN ().
Vista y Windows 7 siempre muestran todos los caracteres como ellos mismos, nunca como puntos.
Códigos de retorno (ERRORLEVEL)
- 0 (éxito)
- Se encontró coincidencia en al menos una línea de al menos un archivo.
- 1 (falla)
- No se encontraron coincidencias en ninguna línea de ningún archivo.
- Color no válido especificado por la
/A:xx
opción
- 2 (error)
- Opciones incompatibles
/L
y /R
ambas especificadas
- Falta el argumento tras
/A:
, /F:
, /C:
, /D:
, o/G:
- Archivo especificado por
/F:file
o /G:file
no encontrado
- 255 (error)
Fuente de datos para buscar (actualizado en base a pruebas con Windows 7)
Findstr puede buscar datos de solo una de las siguientes fuentes:
nombres de archivo especificados como argumentos y / o utilizando la /F:file
opción
stdin a través de la redirección findstr "searchString" <file
flujo de datos desde una tubería type file | findstr "searchString"
Los argumentos / opciones tienen prioridad sobre la redirección, que tiene prioridad sobre los datos canalizados.
Argumentos de nombre de archivo y /F:file
se pueden combinar. Se pueden usar múltiples argumentos de nombre de archivo. Si /F:file
se especifican varias opciones, solo se usa la última. Los comodines están permitidos en los argumentos de nombre de archivo, pero no dentro del archivo señalado por /F:file
.
Fuente de las cadenas de búsqueda (actualizado basado en pruebas con Windows 7)
Las opciones /G:file
y /C:string
pueden combinarse. Se /C:string
pueden especificar múltiples opciones. Si /G:file
se especifican varias opciones, solo se usa la última. Si se usa /G:file
o /C:string
, se supone que todos los argumentos que no son opciones son archivos para buscar. Si no se utiliza ni /G:file
tampoco /C:string
, entonces el primer argumento sin opción se trata como una lista delimitada por espacios de términos de búsqueda.
Los nombres de archivo no se deben citar dentro del archivo cuando se usa la /F:FILE
opción.
Los nombres de archivo pueden contener espacios y otros caracteres especiales. La mayoría de los comandos requieren que se citen dichos nombres de archivo. Pero la /F:files.txt
opción FINDSTR requiere que los nombres de archivo dentro de files.txt NO se deben citar. El archivo no se encontrará si se cita el nombre.
ERROR: los nombres cortos de archivo 8.3 pueden romper las opciones /D
y/S
Al igual que con todos los comandos de Windows, FINDSTR intentará hacer coincidir tanto el nombre largo como el nombre corto 8.3 al buscar archivos para buscar. Suponga que la carpeta actual contiene los siguientes archivos no vacíos:
b1.txt
b.txt2
c.txt
El siguiente comando encontrará con éxito los 3 archivos:
findstr /m "^" *.txt
b.txt2
coincide porque coincide el nombre corto correspondiente B9F64~1.TXT
. Esto es coherente con el comportamiento de todos los demás comandos de Windows.
Pero un error con las opciones /D
y /S
hace que los siguientes comandos solo encuentrenb1.txt
findstr /m /d:. "^" *.txt
findstr /m /s "^" *.txt
El error evita que b.txt2
se encuentren, así como todos los nombres de archivo que se ordenan después b.txt2
dentro del mismo directorio. Se encuentran archivos adicionales que se ordenan antes, como a.txt
. Los archivos adicionales que se ordenan más tarde, como d.txt
, se pierden una vez que se ha activado el error.
Cada directorio buscado se trata de forma independiente. Por ejemplo, la /S
opción comenzaría a buscar con éxito en una carpeta secundaria después de no encontrar archivos en el padre, pero una vez que el error hace que se pierda un nombre de archivo corto en el niño, también se perderán todos los archivos posteriores en esa carpeta secundaria. .
Los comandos funcionan sin errores si se crean los mismos nombres de archivo en una máquina que tiene la generación de nombres NTFS 8.3 deshabilitada. Por supuesto b.txt2
, no se encontraría, pero c.txt
se encontraría correctamente.
No todos los nombres cortos activan el error. Todas las instancias de comportamiento con errores que he visto involucran una extensión que tiene más de 3 caracteres con un nombre corto de 8.3 que comienza igual que un nombre normal que no requiere un nombre de 8.3.
El error ha sido confirmado en XP, Vista y Windows 7.
Caracteres no imprimibles y la /P
opción
La /P
opción hace que FINDSTR omita cualquier archivo que contenga cualquiera de los siguientes códigos de bytes decimales:
0-7, 14-25, 27-31.
Dicho de otra manera, la /P
opción solo omitirá los archivos que contengan caracteres de control no imprimibles. Los caracteres de control son códigos menores o iguales a 31 (0x1F). FINDSTR trata los siguientes caracteres de control como imprimibles:
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)
Todos los demás caracteres de control se tratan como no imprimibles, cuya presencia hace que la /P
opción omita el archivo.
<CR><LF>
La entrada canalizada y redirigida puede haberse agregado Si la entrada está canalizada y el último carácter de la secuencia no <LF>
, FINDSTR se agregará automáticamente <CR><LF>
a la entrada. Esto se ha confirmado en XP, Vista y Windows 7. (Solía pensar que la tubería de Windows era responsable de modificar la entrada, pero desde entonces descubrí que FINDSTR realmente está haciendo la modificación).
Lo mismo es cierto para la entrada redirigida en Vista. Si el último carácter de un archivo utilizado como entrada redirigida no lo es <LF>
, FINDSTR se agregará automáticamente <CR><LF>
a la entrada. Sin embargo, XP y Windows 7 no alteran la entrada redirigida.
FINDSTR se bloquea en XP y Windows 7 si la entrada redirigida no termina con<LF>
Esta es una "característica" desagradable en XP y Windows 7. Si el último carácter de un archivo utilizado como entrada redirigida no termina <LF>
, FINDSTR se bloqueará indefinidamente una vez que llega al final del archivo redirigido.
La última línea de datos
canalizados puede ignorarse si consta de un solo carácter Si la entrada se canaliza y la última línea consta de un único carácter al que no sigue <LF>
, FINDSTR ignora por completo la última línea.
Ejemplo: el primer comando con un solo carácter y ninguno <LF>
no coincide, pero el segundo comando con 2 caracteres funciona bien, al igual que el tercer comando que tiene un carácter con nueva línea de terminación.
> set /p "=x" <nul | findstr "^"
> set /p "=xx" <nul | findstr "^"
xx
> echo x| findstr "^"
x
Reportado por el usuario de DosTips Sponge Belly en el nuevo error de findtr . Confirmado en XP, Windows 7 y Windows 8. Todavía no he oído hablar de Vista. (Ya no tengo Vista para probar).
Sintaxis de la opción Las
opciones se pueden prefijar con /
o las -
opciones se pueden concatenar después de una sola /
o -
. Sin embargo, la lista de opciones concatenadas puede contener como máximo una opción de caracteres múltiples como OFF o F :, y la opción de caracteres múltiples debe ser la última opción en la lista.
Las siguientes son formas equivalentes de expresar una búsqueda de expresiones regulares sin distinción entre mayúsculas y minúsculas para cualquier línea que contenga "hola" y "adiós" en cualquier orden
/i /r /c:"hello.*goodbye" /c:"goodbye.*hello"
-i -r -c:"hello.*goodbye" /c:"goodbye.*hello"
/irc:"hello.*goodbye" /c:"goodbye.*hello"
Límites de longitud de la cadena de búsqueda
En Vista, la longitud máxima permitida para una sola cadena de búsqueda es de 511 bytes. Si alguna cadena de búsqueda supera 511, el resultado es un FINDSTR: Search string too long.
error con ERRORLEVEL 2.
Al realizar una búsqueda de expresión regular, la longitud máxima de la cadena de búsqueda es 254. Una expresión regular con una longitud entre 255 y 511 dará como resultado un FINDSTR: Out of memory
error con ERRORLEVEL 2. Una longitud de expresión regular> 511 produce el FINDSTR: Search string too long.
error.
En Windows XP, la longitud de la cadena de búsqueda es aparentemente más corta. Error Findstr: "Cadena de búsqueda demasiado larga": ¿Cómo extraer y hacer coincidir la subcadena en el bucle "for"?
El límite de XP es de 127 bytes para búsquedas literales y expresiones regulares.
Límites de longitud de línea Los
archivos especificados como argumento de línea de comando o mediante la opción / F: FILE no tienen límite de longitud de línea conocido. Las búsquedas se ejecutaron correctamente en un archivo de 128 MB que no contenía un solo <LF>.
Los datos canalizados y la entrada redirigida están limitados a 8191 bytes por línea. Este límite es una "característica" de FINDSTR. No es inherente a las tuberías ni a la redirección. FINDSTR usando stdin redirigido o entrada canalizada nunca coincidirá con ninguna línea que sea> = 8k bytes. Las líneas> = 8k generan un mensaje de error para stderr, pero ERRORLEVEL sigue siendo 0 si la cadena de búsqueda se encuentra en al menos una línea de al menos un archivo.
Tipo de búsqueda predeterminado: Literal vs Expresión regular
/C:"string"
: el valor predeterminado es / L literal. Combinar explícitamente la opción / L con / C: "string" ciertamente funciona pero es redundante.
"string argument"
- El valor predeterminado depende del contenido de la primera cadena de búsqueda. (Recuerde que <space> se usa para delimitar las cadenas de búsqueda). Si la primera cadena de búsqueda es una expresión regular válida que contiene al menos un metacarácter sin escape, todas las cadenas de búsqueda se tratan como expresiones regulares. De lo contrario, todas las cadenas de búsqueda se tratan como literales. Por ejemplo, "51.4 200"
se tratará como dos expresiones regulares porque la primera cadena contiene un punto sin escape, mientras "200 51.4"
que se tratará como dos literales porque la primera cadena no contiene metacaracteres.
/G:file
- El valor predeterminado depende del contenido de la primera línea no vacía en el archivo. Si la primera cadena de búsqueda es una expresión regular válida que contiene al menos un meta-carácter sin escape, entonces todas las cadenas de búsqueda se tratan como expresiones regulares. De lo contrario, todas las cadenas de búsqueda se tratan como literales.
Recomendación: siempre especifique explícitamente /L
la opción literal o /R
la opción de expresión regular cuando use "string argument"
o /G:file
.
ERROR: especificar varias cadenas de búsqueda literales puede dar resultados poco confiables
El siguiente ejemplo FINDSTR simple no puede encontrar una coincidencia, aunque debería.
echo ffffaaa|findstr /l "ffffaaa faffaffddd"
Este error ha sido confirmado en Windows Server 2003, Windows XP, Vista y Windows 7.
Según los experimentos, FINDSTR puede fallar si se cumplen todas las condiciones siguientes:
- La búsqueda está utilizando múltiples cadenas de búsqueda literales
- Las cadenas de búsqueda son de diferentes longitudes.
- Una cadena de búsqueda corta tiene cierta cantidad de superposición con una cadena de búsqueda más larga
- La búsqueda distingue entre mayúsculas y minúsculas (sin
/I
opción)
En cada falla que he visto, siempre es una de las cadenas de búsqueda más cortas que falla.
Para obtener más información, consulte ¿Por qué este ejemplo FINDSTR con múltiples cadenas de búsqueda literales no encuentra una coincidencia?
Citas y backslahses dentro de los argumentos de la línea de comandos
Nota: los comentarios del usuario MC ND reflejan las reglas realmente complicadas para esta sección. Hay 3 fases de análisis distintas involucradas:
- Primero cmd.exe puede requerir que algunas comillas se escapen como ^ "(realmente nada que ver con FINDSTR)
- Siguiente FINDSTR utiliza el analizador de argumentos MS C / C ++ anterior a 2008 , que tiene reglas especiales para "y \
- Una vez que finaliza el analizador de argumentos, FINDSTR trata adicionalmente \ seguido de un carácter alfanumérico como literal, pero \ seguido de un carácter no alfanumérico como un carácter de escape
El resto de esta sección resaltada no es 100% correcta. Puede servir como guía para muchas situaciones, pero las reglas anteriores son necesarias para una comprensión total.
Cita de escape dentro de las cadenas de búsqueda de línea de comando Las
comillas dentro de las cadenas de búsqueda de línea de comando se deben escapar con una barra diagonal inversa como
\"
. Esto es cierto tanto para las cadenas de búsqueda literales como de expresiones regulares. Esta información ha sido confirmada en XP, Vista y Windows 7.
Nota: La cotización también puede necesitar escapar para el analizador CMD.EXE, pero esto no tiene nada que ver con FINDSTR. Por ejemplo, para buscar una sola cita, puede usar:
FINDSTR \^" file && echo found || echo not found
Escape de barra diagonal dentro de las cadenas de búsqueda literales de la línea de comandos La
barra diagonal inversa en una cadena de búsqueda literal normalmente se puede representar como
\
o como \\
. Son típicamente equivalentes. (Puede haber casos inusuales en Vista donde la barra invertida siempre se debe escapar, pero ya no tengo una máquina Vista para probar) .
Pero hay algunos casos especiales:
Al buscar barras invertidas consecutivas, se deben escapar todas menos la última . La última barra invertida se puede escapar opcionalmente.
\\
puede codificarse como \\\
o\\\\
\\\
puede codificarse como \\\\\
o\\\\\\
Buscar una o más barras diagonales inversas antes de una cita es extraño. La lógica sugeriría que la cita se debe escapar, y cada una de las barras diagonales inversas principales necesitarían escapar, ¡pero esto no funciona! En cambio, cada una de las barras diagonales inversas deben tener doble escape, y la cita se escapa normalmente:
\"
debe codificarse como \\\\\"
\\"
debe codificarse como \\\\\\\\\"
Como se señaló anteriormente, una o más comillas escapadas también pueden requerir escapar con ^
el analizador CMD
La información en esta sección ha sido confirmada en XP y Windows 7.
Retroceso de escape dentro de las cadenas de búsqueda de expresiones regulares de la línea de comandos
Solo Vista: la barra invertida en una expresión regular debe tener doble escape como \\\\
, o bien escapar solo dentro de un conjunto de clases de caracteres como
[\\]
XP y Windows 7: la barra invertida en una expresión regular siempre se puede representar como [\\]
. Normalmente se puede representar como \\
. Pero esto nunca funciona si la barra inclinada invertida precede a una cita escapada.
Una o más barras inclinadas invertidas antes de una cotización escapada deben ser doblemente escapadas o codificadas como [\\]
\"
puede codificarse como \\\\\"
o[\\]\"
\\"
puede codificarse como \\\\\\\\\"
o [\\][\\]\"
o\\[\\]\"
Cita y barra
invertida de escape dentro de / G: cadenas de búsqueda literal de ARCHIVO Las comillas y las barras invertidas independientes dentro de un archivo de cadena de búsqueda literal especificado por / G: archivo no necesitan escapar, pero pueden serlo.
"
y \"
son equivalentes
\
y \\
son equivalentes
Si la intención es encontrar \\, entonces se debe escapar al menos la barra diagonal inversa inicial. Ambos \\\
y \\\\
trabajo.
Si la intención es encontrar \", entonces por lo menos debe ser escapado de la barra invertida inicial. Tanto \\"
y \\\"
trabajo.
Cita de escape y barra invertida dentro de / G: cadenas de búsqueda de expresiones regulares de ARCHIVO
Este es el caso en el que las secuencias de escape funcionan según lo esperado según la documentación. La cita no es un metacarácter regex, por lo que no necesita ser escapado (pero puede serlo). La barra invertida es un metacarácter regex, por lo que debe escaparse.
Límites de caracteres para los parámetros de la línea de comandos: transformación ASCII extendida
El carácter nulo (0x00) no puede aparecer en ninguna cadena en la línea de comandos. Cualquier otro carácter de un solo byte puede aparecer en la cadena (0x01 - 0xFF). Sin embargo, FINDSTR convierte muchos caracteres ASCII extendidos que encuentra dentro de los parámetros de la línea de comandos en otros caracteres. Esto tiene un gran impacto de dos maneras:
1) Muchos caracteres ASCII extendidos no coincidirán si se usan como una cadena de búsqueda en la línea de comando. Esta limitación es la misma para búsquedas literales y expresiones regulares. Si una cadena de búsqueda debe contener ASCII extendido, entonces se /G:FILE
debe usar la opción en su lugar.
2) FINDSTR puede no encontrar un archivo si el nombre contiene caracteres ASCII extendidos y el nombre del archivo se especifica en la línea de comando. Si un archivo para buscar contiene ASCII extendido en el nombre, entonces se /F:FILE
debe usar la opción en su lugar.
Aquí hay una lista completa de transformaciones de caracteres ASCII extendidas que FINDSTR realiza en cadenas de línea de comandos. Cada carácter se representa como el valor del código de byte decimal. El primer código representa el carácter tal como se proporciona en la línea de comando, y el segundo código representa el carácter en el que se transforma. Nota: esta lista se compiló en una máquina estadounidense. No sé qué impacto pueden tener otros idiomas en esta lista.
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
Cualquier carácter> 0 que no esté en la lista anterior se trata como sí mismo, incluidos <CR>
y < LF>
. La forma más fácil de incluir caracteres impares como <CR>
y <LF>
es colocarlos en una variable de entorno y usar la expansión retrasada dentro del argumento de la línea de comandos.
Límites de caracteres para las cadenas que se encuentran en los archivos especificados por las opciones / G: FILE y / F: FILE
El carácter nul (0x00) puede aparecer en el archivo, pero funciona como el terminador de cadena C. Cualquier carácter después de un carácter nulo se trata como una cadena diferente como si estuviera en otra línea.
Los caracteres <CR>
y <LF>
se tratan como terminadores de línea que terminan una cadena, y no se incluyen en la cadena.
Todos los demás caracteres de un solo byte se incluyen perfectamente dentro de una cadena.
Búsqueda de archivos Unicode
FINDSTR no puede buscar correctamente la mayoría de Unicode (UTF-16, UTF-16LE, UTF-16BE, UTF-32) porque no puede buscar bytes nul y Unicode generalmente contiene muchos bytes nul.
Sin embargo, el comando TYPE convierte UTF-16LE con BOM en un conjunto de caracteres de un solo byte, por lo que un comando como el siguiente funcionará con UTF-16LE con BOM.
type unicode.txt|findstr "search"
Tenga en cuenta que los puntos de código Unicode que no son compatibles con su página de códigos activa se convertirán en ?
caracteres.
Es posible buscar UTF-8 siempre que su cadena de búsqueda contenga solo ASCII. Sin embargo, la salida de la consola de cualquier carácter UTF-8 de varios bytes no será correcta. Pero si redirige la salida a un archivo, el resultado se codificará correctamente UTF-8. Tenga en cuenta que si el archivo UTF-8 contiene una lista de materiales, entonces la lista de materiales se considerará como parte de la primera línea, lo que podría descartar una búsqueda que coincida con el comienzo de una línea.
Es posible buscar caracteres UTF-8 de varios bytes si coloca su cadena de búsqueda en un archivo de búsqueda codificado UTF-8 (sin BOM) y utiliza la opción / G.
Fin de la línea
FINDSTR rompe las líneas inmediatamente después de cada <LF>. La presencia o ausencia de <CR> no tiene impacto en los saltos de línea.
Buscar en saltos de línea
Como se esperaba, el.
metacarácter regex no coincidirá con <CR> o <LF>. Pero es posible buscar a través de un salto de línea usando una cadena de búsqueda de línea de comando. Tanto los caracteres <CR> como <LF> deben coincidir explícitamente. Si se encuentra una coincidencia de varias líneas, solo se imprime la primera línea de la coincidencia. FINDSTR luego vuelve a la segunda línea de la fuente y comienza la búsqueda nuevamente, una especie de función de "mirar hacia adelante".
Suponga que TEXT.TXT tiene estos contenidos (podría ser estilo Unix o Windows)
A
A
A
B
A
A
Entonces este guión
@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
da estos resultados
1:A
2:A
5:A
La búsqueda en saltos de línea con la opción / G: FILE es imprecisa porque la única forma de hacer coincidir <CR> o <LF> es a través de una expresión de rango de clase de caracteres regex que emparede los caracteres EOL.
[<TAB>-<0x0B>]
coincide con <LF>, pero también coincide con <TAB> y <0x0B>
[<0x0C>-!]
coincide con <CR>, pero también coincide con <0x0C> y!
Nota: lo anterior son representaciones simbólicas del flujo de bytes regex ya que no puedo representar gráficamente los caracteres.
La respuesta continuó en la parte 2 a continuación ...
grep
que se entiende y documenta muy bien :-) Ver stackoverflow.com/questions/2635740/… por ejemplo.