답변
내가 GetRange 추가를 당신을위한 함수 :
EDIT : 결과를 얻으려면 300.000 줄의 텍스트 파일로 테스트. 2
UPDATE는 지금은하지 않는 C + C-기능, 빈 줄을 받아들입니다.
TextMan.bat
@Echo OFF :: TEXT MANIPULATOR ROUTINE v0.5 :: by Elektro [email protected] REM SYNTAX: :: :: TEXTMAN [ACTION] [LINE(S)] [FILE] [TEXT] :: :: * [LINE(S)] parameter is Optional for some actions :: * [TEXT] parameter is Optional for some actions REM ACTIONS: :: :: AB = ADD_BEGINNING * Add text to the beginning of a line. :: AE = ADD_ENDING * Add text to the end of a line. :: E = ERASE * Delete a line. :: I = INSERT * Add a empty line (Or a line with text). :: RL = REPLACE_LINE * Replace a entire line. :: RS = REPLACE_STRING * Replace word from line. :: RSA = REPLACE_STRING_ALL * Replace word from all lines. :: C+ = CHARACTER_PLUS * Delete the first "X" characters from all lines. :: C- = CHARACTER_LESS * Delete the last "X" characters from all lines. :: L+ = LINE_PLUS * Cut the first "X" amount of lines. :: L- = LINE_LESS * Cut the last "X" amount of lines. :: GL = GET_LINE * Delete all except "X" line. :: GR = GET_RANGE * Delete all except "X" range of lines. REM EXAMPLES: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: Delete the line 3 :: :: Call :TEXTMAN E 3 "Test.txt" :: :: :: :: Add a string to the beginning of line 3 :: :: Call :TEXTMAN AL 3 "Test.txt" "Elektro [email protected]" :: :: :: :: Add a string to the end of line 3. :: :: Call :TEXTMAN AR 3 "Test.txt" "Elektro [email protected]" :: :: :: :: Add a empty line at line 3. :: :: Call :TEXTMAN I 3 "Test.txt" :: :: :: :: Add a line with a word at line 3. :: :: Call :TEXTMAN I 3 "Test.txt" "Elektro [email protected]" :: :: :: :: Replace the line 3 with "Elektro [email protected]". :: :: Call :TEXTMAN RL 3 "Test.txt" "Elektro [email protected]" :: :: :: :: Replace the words "Elektro" to "[email protected]" in line 3. :: :: Call :TEXTMAN RS 3 "Test.txt" "Elektro" "[email protected]" :: :: :: :: Replace the words "Elektro" to "[email protected]" in all lines. :: :: Call :TEXTMAN RSA "Test.txt" "Elektro" "[email protected]" :: :: :: :: Delete the first 3 characters in all lines. :: :: Call :TEXTMAN C+ 3 "Test.txt" :: :: :: :: Delete the last 3 characters in all lines. :: :: Call :TEXTMAN C- 3 "Test.txt" :: :: :: :: Delete the first 3 lines. :: :: Call :TEXTMAN L+ 3 "Test.txt" :: :: :: :: Delete the last 3 lines. :: :: Call :TEXTMAN L- 3 "Test.txt" :: :: :: :: Delete all except the line number 3. :: :: Call :TEXTMAN SL 3 "Test.txt" :: :: :: :: Delete all except the 3 to 9 range of lines. :: :: Call :TEXTMAN SR 3 9 "Test.txt" :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :TEXTMAN (SET /A "A=0", "LINE=0", "TOTAL_LINES=0") & (CALL :%~1 %* || (ECHO Invalid parameter & Exit /B 1)) & (GOTO:EOF) :AB (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE (if "%%B" EQU "" ((Echo %~4)>> "%~3.NEW") ELSE ((Echo %~4%%B)>> "%~3.NEW"))"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) :AE (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE ((Echo %%B%~4)>> "%~3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) :E (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B) >> "%~3.NEW"))"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) :I (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF "%%LINE%%" EQU "%~2" (IF NOT "%~4" EQU "" ((Echo %~4) >> "%~3.NEW") ELSE (Echo+>> "%~3.NEW"))" & (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW"))))) && (CALL :RENAMER "%~3") & (GOTO:EOF) :RL (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE ((Echo %~4)>> "%~3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) :RS (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE (CALL SET "STRING=%%B" && (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((CALL ECHO %%STRING:%~4=%~5%%)>> "%~3.NEW")))"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) :RSA (For /F "tokens=1* delims=]" %%A in ('type "%~2" ^| find /n /v ""') DO (CALL SET "STRING=%%B" && (if "%%B" EQU "" (Echo+>> "%~2.NEW") ELSE ((CALL ECHO %%STRING:%~3=%~4%%)>>"%~2.NEW")))) && (CALL :RENAMER "%~2") & (GOTO:EOF) :C+ (For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set "LINE=%%@" && (CALL ECHO %%LINE:~%~2%% >> "%~3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) :C- (For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set "LINE=%%@" && (CALL ECHO %%LINE:~0,-%~2%% >> "%~3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) :L+ (Call SET /A "A=%~2") && (Call TYPE "%~3" |@MORE +%%A%% > "%~3.NEW") && (CALL :RENAMER "%~3") & (GOTO:EOF) :L- (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (CALL SET /A "TOTAL_LINES+=1")) & (CALL SET /A "TOTAL_LINES-=%~2-1") & (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" & Call echo "%%LINE%%"|@FIND "%%TOTAL_LINES%%" >NUL) && (CALL :RENAMER "%~3" && GOTO:EOF) || (Echo %%B >> "%~3.NEW")) :GL (Call SET /A "A=%~2" && Call SET /A "A-=1") && (Call TYPE "%~3" |@MORE +%%A%% > "%temp%\getline.tmp") && (For /F "tokens=1* delims=]" %%A in ('type "%temp%\getline.tmp" ^| find /n /v ""') DO ((if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)> "%~3.NEW"))) && ((CALL :RENAMER "%~3") & (GOTO:EOF))) :GR (For /F "tokens=1* delims=]" %%A in ('type "%~4" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "(IF "%%LINE%%" GEQ "%~2" IF "%%LINE%%" LEQ "%~3" (if "%%B" EQU "" (Echo+>> "%~4.NEW") ELSE ((Echo %%B)>> "%~4.NEW"))) && (IF "%%LINE%%" EQU "%~3" Exit /B 1)" || ((CALL :RENAMER "%~4") & (GOTO:EOF))))) :RENAMER (REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~1.BAK" "%TEMP%\" >NUL) & (REN "%~1.NEW" "%~nx1") & (GOTO:EOF)
UPDATE :
만의 코드의이 부분을 사용할 필요가내 일상 :
@Echo OFF Call :TEXTMAN 5 30 "TextFile.txt" Pause&Exit :TEXTMAN (SET /A "A=0", "LINE=0", "TOTAL_LINES=0") & (CALL :%~1 %* || (ECHO Parametro incorrecto & Exit /B 1)) & (GOTO:EOF) :GR (For /F "tokens=1* delims=]" %%A in ('type "%~4" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "(IF "%%LINE%%" GEQ "%~2" IF "%%LINE%%" LEQ "%~3" (if "%%B" EQU "" (Echo+>> "%~4.NEW") ELSE ((Echo %%B)>> "%~4.NEW"))) && (IF "%%LINE%%" EQU "%~3" Exit /B 1)" || ((CALL :RENAMER "%~4") & (GOTO:EOF))))) :RENAMER (REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~1.BAK" "%TEMP%\" >NUL) & (REN "%~1.NEW" "%~nx1") & (GOTO:EOF)
또는 당신은 할 수있다 단계별로 단계별로 :
012 3,516,우리
1 ... 후 (예를 들면 5 내지 10) Y의 범위 X를 원한다면 - 제 5 개 라인을 절단하는 임시 파일에 TEXTFILE 쓰기 :
2 -에 루프를 수행 TempFile은 시작부터 줄을 다른 textfile에 쓰고 "Y"줄에 도달하면 멈 춥니 다.
@Echo OFF Setlocal enabledelayedexpansion Set /A "X=5" Set /A "Y=10" Set /A "Z=%Y%-%X%" (Type "Test.txt" | MORE +%X%)>"TempFile.txt" (For /F "Usebackq Tokens=*" %%# in ("TempFile.txt") Do ( Set /A Line+=1 If not !Line! GTR %Z% (Echo %%#) Else (Exit) ))>"MyRange.txt"
적어도 코드는 빈 줄을 보존하지 않습니다. 줄이 손상되었습니다. – foxidrive
아이디어를 주셔서 감사합니다. 빈 줄을 구문 분석하도록 코드가 업데이트되었습니다. :). – ElektroStudios
아직 많은 버그가 있습니다. 그것은'ON','OFF' 또는'/?'와 함께 실패한'''후행''을 제거하고''cat & dog "'이 한줄로 실패합니다 ...''Call Set '/A "LINE + = 1"'속도가 느려지므로 여기서는 유용하지 않습니다. – jeb
배치는 그것을 할 수 있지만, 성능 저하 및 독 문자가 문제가 될 수있을 것입니다 - 그리고 파일의 구성이 중요 할 수있다.
다운로드 GnuSed이 명령을 실행
Call :TEXTMAN SR RANGE_A RANGE_B "Test.txt"
PS : 당신이 하나 개의 명령을을 writting 쉽게 내 루틴을 사용할 수있는 쉬운 방법을 원하는 경우
sed 5,30d "file.txt" >"file2.txt"
많은 수의 행을 읽고 인쇄 출력이 필요한 경우에만 "성능 저하"가 발생합니다. 그는 단지 5 행에서 30 행까지 읽기만하면되고, 30 행에서 파일의 내용을 읽으려면 bat 파일이 멈출 수 있습니다. – ElektroStudios
- 1. Unix : 여러 하위 디렉토리의 파일을 일괄 처리로 일괄 처리
- 2. 일괄 처리 - 일괄 처리로 파일 삭제 확인을 중지하는 방법
- 3. 일괄 처리로 지오 코딩
- 4. 다른 사용자의 폴더에서 파일을 일괄 처리로 제거
- 5. 일괄 처리로 jmx를 실행하려고합니다.
- 6. 일괄 처리로 정렬하기
- 7. 일괄 처리로 파일 이동
- 8. 일괄 처리로 날짜 지정
- 9. ModelControllerClient를 일괄 처리로 실행
- 10. 일괄 처리로 레코드 선택
- 11. 주소 일괄 처리/일괄 삭제 -
- 12. 컬렉션을 일괄 처리로 나누려면 어떻게해야합니까?
- 13. 정규식 검색 일괄 처리로 바꾸기
- 14. 검색 추가하고 일괄 처리로 바꾸기
- 15. 다중 명령을 일괄 처리로 실행
- 16. 문자열의 정규식을 일괄 처리로 대체하십시오.
- 17. NetLogo 애플릿을 일괄 처리로 저장
- 18. 일괄 처리로 여러 명령 보내기
- 19. 일괄 처리로 CACLS 함수를 반복합니다.
- 20. vbYesNoCancel의 출력을 일괄 처리로 전달합니다.
- 21. 일괄 처리로 여러 파일 복사
- 22. tsql - 일괄 처리 성능 일괄 처리
- 23. .net Rx : 메시지의 일괄 처리 일괄 처리
- 24. 일괄 처리 스크립트가 아닌 명령 일괄 처리
- 25. 일괄 처리
- 26. 일괄 처리를 사용하여 30 일 된 폴더를 일괄 처리로 이동
- 27. 일괄 처리로 클라우드 스토리지 개체 삭제
- 28. 파일 일괄 처리 알고리즘
- 29. WordPress에서 일괄 처리로 chrono 설정을 비활성화하는 방법
- 30. 일괄 처리로 HTML 생성 .. 이스케이프 인용 부호
"순수 배치"에서 수행 할 수 있지만 @ foxidrive의 제안을 더 잘 사용해야합니다. 이 경우 일괄 처리가 매우 느립니다. – Endoro
@Endoro 너무 친척입니다. FOR 명령은 파일의 모든 내용을 처리 할 필요가 없습니다. 5 행부터 시작하여 30 행에서 읽는 것을 중지 할 수 있습니다. – ElektroStudios
실례합니다. 이 주제는 "큰 파일에서 5 ~ 30 행을 제거하고 나머지는 반환합니다"라고 이해합니다. 25 개에서 26 개까지의 라인을 원한다면 대신 "Extract range of lines"을 사용했습니다. 내가 잘못? 죄송합니다. 영어는 모국어가 아니기 때문에 아마도이 점은 관용구적인 세부 사항입니다. – Aacini