2013-05-17 3 views
1

파일에 단어 Shutdown이 (가) 주어진 횟수만큼 포함되어 있는지 찾기 위해 Windows 배치 파일에서 방법을 찾고 있습니다.FINDSTR에있는 RegEx 문자열의 여러 인스턴스

FINDSTR /r .*Shutdown.*{5} file.txt 

이 작동하지 않는 것,하지만 난 {5}를 제거하면이 성공적으로 실행 :

나는이 FINDSTR를 사용하여 시도했다.

또한 나는 5을 변수로 사용하고 싶습니다. 아마도 이것은 일종의 동적 명령으로 가능합니까?

감사

답변

2
.*Shutdown.*Shutdown.*Shutdown.*Shutdown.*Shutdown.* 

는 srsly FINDSTR

위한 유일한 방법이 될 것 같다.


시험 배치 :

FAILED IN "Shutdown" 
FAILED IN "Shutdown Shutdown" 
FAILED IN "Shutdown Shutdown Shutdown Shutdown" 
FOUND IN "Shutdown Shutdown Shutdown Shutdown Shutdown" 
FOUND IN "Shutdown already !Shutdown Shutdown Shutdown Shutdown now" 
FOUND IN "You should now Shutdown Shutdown Shutdown Shutdown Shutdown" 
FOUND IN "ShutdownShutdownShutdownShutdownShutdown" 
FAILED IN "OK, don't shutdown then..." 

작품 나를 위해 (W7)

: f5shutdown.txt

Shutdown 
Shutdown Shutdown 
Shutdown Shutdown Shutdown Shutdown 
Shutdown Shutdown Shutdown Shutdown Shutdown 
Shutdown already !Shutdown Shutdown Shutdown Shutdown now 
You should now Shutdown Shutdown Shutdown Shutdown Shutdown 
ShutdownShutdownShutdownShutdownShutdown 
OK, don't shutdown then... 

결과에

@ECHO OFF 
SETLOCAL 
FOR /f "delims=" %%i IN (f5shutdown.txt) DO (
ECHO %%i|FINDSTR /r .*Shutdown.*Shutdown.*Shutdown.*Shutdown.*Shutdown.* >NUL 
IF ERRORLEVEL 1 ECHO FAILED IN "%%i" 
IF NOT ERRORLEVEL 1 ECHO FOUND IN "%%i" 
) 

GOTO :eof 

테스트 TEXTFILE


아 - 아마 당신은

@ECHO OFF 
SETLOCAL 
FOR /f "delims=" %%i IN (f5shutdown.txt) DO (
ECHO %%i|FINDSTR /r .*Shutdown.*Shutdown.*Shutdown.*Shutdown.*Shutdown.* >NUL 
IF ERRORLEVEL 1 ECHO FAILED IN "%%i" 
IF NOT ERRORLEVEL 1 ECHO FOUND IN "%%i" 
) 

:: For 'shutdown' on n different lines: (assuming case-insensitive) 
FOR /f %%i IN ('FIND /i /c "shutdown" ^<f5shutdown.txt') DO SET shutdowns=%%i 
ECHO Second method: %shutdowns% lines found with "Shutdown" 

:: For 'shutdown' occurrences (assuming case-insensitive) 
SET /a shutdowns=0 
FOR /f "delims=" %%i IN (f5shutdown.txt) DO (
SET line=%%i 
CALL :findem 
) 
ECHO Third method found "Shutdown" %shutdowns% times 
GOTO :eof 

:findem 
SET line=%line:"=% 
SET after=%line:*shutdown=% 
IF NOT DEFINED after SET /a shutdowns+=1&GOTO :EOF 
if NOT "%line%"=="%after%" SET "line=%after%"&SET /a shutdowns+=1&GOTO findem 
GOTO :eof 

은 (나는에 대한 추가 비 종료 함유 라인을 추가 ... 파일 "에 5 번 발생"5 (또는 무엇이든) 라인에서 발생 또는 "의미 시험. 발견 8 개 라인과 28 개 발생)

+0

OMG RLY는? Ok. 그래서 가변 수의'. * Shutdown. *'을 원한다면, 나는 주위를 돌아 다닐 필요가있을 것이다. – Arj

+0

당신은 그것을 하나 가지고 있습니다. 평소처럼 - 반 - 어, 구현 - .BBKED 구현 ... – Magoo

+0

난 그냥 코드를 시도하고 올바른 결과를 반환하지 않는 것 .. 그것은 문자열을 찾지 못했습니다 – Arj

0

종료가 file.txt를 만 5 행에있을 때이 감지합니다

@echo off 
for /f %%a in ('find /i /c "shutdown" ^< "file.txt" ') do if %%a EQU 5 echo found it 5 times 
+0

파일에 SHUTDOWN이있는 행이 5 개 이상 포함되어 있는지 감지하지만 일부 행이 동일한 행에 표시되면 SHUTDOWN 수를 제대로 계산하지 못합니다. 그것은 OP에 대한 문제 일 수도 있고 아닐 수도 있습니다. – dbenham

+0

내 구체적인 경우에는 괜찮을 지 모르지만 일반적으로 이상적인 솔루션은 전체 카운트를 제공하거나 같은 줄에 여러 인스턴스를 포함/제외하는 옵션을 제공합니다. – Arj

2

이 "종료"가 5 번 이상 나타나는 경우 감지 FINDSTR를 사용할 수있다 파일 내의 아무 곳이나. 필요한 모든 정보는 What are the undocumented features and limitations of the Windows FINDSTR command?에 포함되어 있지만 조금 까다 롭고 분명하지는 않습니다.

정규식 검색은 캐리지 리턴 및 줄 바꿈 문자를 포함한 모든 중간 문자가 적절한 문자 클래스 범위와 일치하는 한 여러 줄의 종료에 대한 여러 인스턴스와 일치 할 수 있습니다. 여기에 필요한 문자를 게시 할 수 없으므로 꺾쇠 괄호 안에 기호 표기법을 사용합니다.

다음 정규 표현식은 0xFF (십진수 255)를 제외한 모든 바이트 문자와 일치합니다. 두 범위가있는 문자 클래스 표현식과 중간에 0xFF의 틈새로 구성됩니다.

[<0x01>-<space><tab>-<0xEA>] 

당신은 표현 [<0x01>-<0xFE>]해야한다고 생각 수도 있지만 FINDSTR는 숫자 코드 값으로 문자를 대조하지 않기 때문에 문제가 해결되지 않습니다 FINDSTR 실패 (및 중단)를 0xFF가 포함 된 경우 것이기 때문에 차이는 중요하다 .그래서

어디서나 파일 내에서 다음과 같은 정규식 검색을 필요 Shutdown의 5 개 이상의 인스턴스를 찾기 위해 :

Shutdown[<0x01>-<space><tab>-<0xEA>]*Shutdown[<0x01>-<space><tab>-<0xEA>]*Shutdown[<0x01>-<space><tab>-<0xEA>]*Shutdown[<0x01>-<space><tab>-<0xEA>]*Shutdown 

0xEA을 (십진수 234) 문자는 확장 ASCII 문자 및 확장 된 ASCII입니다 FINDSTR 검색의 명령 행에 포함될 수 없습니다. 따라서 검색 문자열은 외부 파일에 저장해야하며 /G:file 옵션을 사용해야합니다.

다음은 첫 번째 인수로 검색 할 최소 Shutdown 인스턴스 수와 두 번째 인수로 검색 할 파일 이름을 사용하는 완전한 배치 스크립트입니다. 다시 나는 필요한 실제 문자 대신 꺽쇠 괄호 안에 기호 표기법을 사용합니다.

@echo off 
set count=%1 
set file=%2 
setlocal enableDelayedExpansion 
set "search=" 
for /l %%N in (1 1 %count%) do set "search=!search!Shutdown[<0x01>-<space><tab>-<0xEA>]*" 
set "search=!search:~0,-9!" 
echo(!search!>search.txt 
findstr /rg:search.txt %file% >nul&&echo FOUND||echo NOT found 

최대 지원 개수는 최대 정규식 문자열 길이로 제한됩니다. XP의 경우 최대 정규식 길이는 127이며, 7의 수와 동일합니다. Vista 및 Windows 7에서 최대 정규식 길이는 254 바이트이며 이는 15의 계산을 지원해야합니다. 그러나 Windows 7에서의 테스트는 최대 12. 추가 테스트에 따르면 최대 길이는 문자열 리터럴 및 문자 클래스의 수와 각각의 상대 배치에 따라 달라집니다. 하지만 정확한 공식을 찾을 수 없었습니다.


외부 파일을 사용하지 않으려는 경우 다음 정규 표현식이 거의 비슷합니다. 0xE0, 0xE2, 0xE3, 0xE4, 0xE5, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xED, 0xEE, 0xFF와 같은 확장 ASCII 16 진 코드를 제외한 모든 문자와 일치합니다.

Shutdown[<0x01>-<space><tab>-Z]*Shutdown[<0x01>-<space><tab>-Z]*Shutdown[<0x01>-<space><tab>-Z]*Shutdown[<0x01>-<space><tab>-Z]*Shutdown 

그리고 여기에 전체 배치 스크립트입니다 :

[<0x01>-<space><tab>-Z] 

전체 정규식 검색이 될 것

@echo off 
setlocal enableDelayedExpansion 
set count=%1 
set file=%2 
set "search=" 
for /l %%N in (1 1 %count%) do set "search=!search!Shutdown[<0x01>-<space><tab>-Z]*" 
set "search=!search:~0,-9!" 
findstr /rc:"!search!" %file% >nul&&echo FOUND||echo NOT found 
+0

EDIT - 검색 문자열 끝에서 불필요한 표현을 제거하여 지원되는 카운트 값을 최대화합니다. 또한 카운트 제한 논의를 수정했습니다. 또한 문자 클래스 범위 표현에서 홀수 시퀀싱에 대한 설명이 추가되었습니다. – dbenham

+0

인크레더블, 상세한 답변. 감사합니다 – Arj

+0

제 경우에는 검색 표현이 너무 길다는 오류가 발생하지만 의심 할 여지없이 코드 예제가 어쨌든 매우 유용 할 것입니다. 감사 – Arj