findstr search incluindo o caractere de retorno

0

Existe uma maneira de usar findstr para pesquisar:

<char>Hello there my friend,</char>
<continued>this is two lines of text</continued>

Eu preciso procurar uma string que inclua uma segunda linha. Eu tentei algo assim:

@echo off
setlocal enableDelayedExpansion
set file=test.txt
set LF=^


:: The above 2 blank lines MUST be preserved!
findstr /RC:"hello!LF!there" "test.txt" >nul
if %errorlevel%==0 echo found 1!
pause

em que test.txt contém:

oh
hello
there
friends
how are
you

Mas isso não é acionado.

    
por Mark Deven 28.09.2018 / 20:20

1 resposta

1

Descubra se há alguma correspondência

@echo off
setlocal enableDelayedExpansion
set file=test.txt
set line1=hello
set line2=there
set LF=^


:: The above 2 blank lines MUST be preserved!
:: Define a CR variable as a CarriageReturn (0x0D) character
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"

cmd /v:on /c^"findstr /rc:"%line1%^!CR^!*^!LF^!%line2%" %file%^" >nul
if %errorlevel%==0 echo found at least 1!
pause

Esse arquivo em lote adiciona uma verificação do caractere Carriage Return, que é necessário para arquivos de texto com novas linhas no estilo do Windows ( CR LF ). Ele também executa findstr em um processo cmd separado com a Expansão com Atraso ativada. Isso parece ser necessário, embora a expansão atrasada já esteja ativada.

Por último, isso inclui duas variáveis: line1 e line2 , que podem ser editadas. Isso torna o arquivo mais legível para edição no futuro. Você também pode incluir as mesmas variáveis de Expressão Regular, então hell. corresponderia a hello , etc.

Encontre o número de correspondências

@echo off
setlocal enableDelayedExpansion
set file=test.txt
set line1=hell.
set line2=there
set LF=^


:: The above 2 blank lines MUST be preserved!
:: Define a CR variable as a CarriageReturn (0x0D) character
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"

set results=0
for /f %%a in ('cmd /v:on /c^"findstr /rc:"%line1%^!LF^!%line2%" %file%^"') do set /A results+=1
echo found %results%!
pause

A diferença notável aqui é o for /f em torno da pesquisa e set /A results+=1 , que adiciona 1 à variável results para cada correspondência encontrada.

Leitura adicional:

por 02.10.2018 / 18:50