Найти и заменить текст добавочным счетчиком - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь написать пакетный скрипт Windows, который может заменить текст увеличенным счетчиком.

У меня есть список воспроизведения с телеканалами, и я хотел бы заменить каждый номер канала в списке воспроизведения.

Мой список воспроизведения имеет такую ​​структуру:

#EXTM3U

#EXTINF:-1,ACS NETWORK TV
http://127.0.0.1:6878/ace/getstream?id=***&.mp4
#EXTINF:-1,Ani
http://127.0.0.1:6878/ace/getstream?id=***&.mp4
#EXTINF:-1,Boomerang HD (France)
http://127.0.0.1:6878/ace/getstream?id=***&.mp4
#EXTINF:-1,Boomerаng TV
http://127.0.0.1:6878/ace/getstream?id=***&.mp4

Я хочу заменить #EXTINF:-1, на:

#EXTINF:-1, 1 
#EXTINF:-1, 2 
#EXTINF:-1, 3 
#EXTINF:-1, 4 
etc.

Мой сценарий имеет следующую структуру:

findstr /c:"EXTINF" "C:\Users\home\Links\Desktop\TV-Playlist.m3u" | find /c /v "GarbageStringDefNotInYourResults" > C:\Users\home\Links\Desktop\1111.count
set /p VAR=< C:\Users\home\Links\Desktop\1111.count

for /L %%n in (1,1,%VAR%) do (

setlocal enableextensions disabledelayedexpansion
set "search=#EXTINF:-1,"
set "replace=#EXTINF:-1,!%%n! "
set "textFile=C:\Users\home\Links\Desktop\TV-Playlist.m3u"
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    >>"%textFile%" echo(!line:%search%=%replace%!
    endlocal
)
)

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Вот одно решение, основанное на вашем коде:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "PlayListFile=C:\Users\home\Links\Desktop\TV-Playlist.m3u"
if not exist "%PlayListFile%" goto EndBatch
set "Counter=1"
for /F "delims= eol=" %%I in ('type "%PlayListFile%" ^& break ^> "%PlayListFile%" ') do (
    set "Line=%%I"
    setlocal EnableDelayedExpansion
    if "!Line:#EXTINF:-1,=!" == "!Line!" (
        >>"%PlayListFile%" echo(!Line!
        endlocal
    ) else (
        >>"%PlayListFile%" call echo !Line:#EXTINF:-1,=#EXTINF:-1,%%Counter%% !
        endlocal
        set /A Counter+=1
    )
)
:EndBatch
endlocal

Но оно удаляет пустые строки из файла, потому что FOR всегда игнорирует пустые строки.

Этот код сохраняеттакже пустые строки:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "PlayListFile=C:\Users\home\Links\Desktop\TV-Playlist.m3u"
if not exist "%PlayListFile%" goto EndBatch

set "Counter=1"
set "TempFile=%TEMP%\%~n0.tmp"

(for /F "delims= eol=" %%I in ('%SystemRoot%\System32\findstr.exe /N /R "^" "%PlayListFile%"') do (
    set "Line=%%I"
    setlocal EnableDelayedExpansion
    set "Line=!Line:*:=!"
    if not defined Line (
        echo(
        endlocal
    ) else if "!Line:#EXTINF:-1,=!" == "!Line!" (
        echo(!Line!
        endlocal
    ) else (
        call echo !Line:#EXTINF:-1,=#EXTINF:-1,%%Counter%% !
        endlocal
        set /A Counter+=1
    )
))>"%TempFile%"

if not %Counter% == 1 move /Y "%TempFile%" "%PlayListFile%"
if exist "%TempFile%" del "%TempFile%"

:EndBatch
endlocal

Подробнее об этом решении см. Как читать и печатать содержимое текстового файла построчно?

Для понимания используемых команд икак они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • del /?
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • move /?
  • set /?
  • setlocal /?
0 голосов
/ 01 января 2019

Итак, если я понимаю ваш вопрос, и если я могу сделать один совет:

Поставьте 1 для обработки счетчика и переименуйте строку, в конце концов замените файл:

@echo off && setlocal enableextensions enabledelayedexpansion

set _m3u_file_in="%userprofile%\Links\Desktop\TV-Playlist.m3u"
set _m3u_file_out="%userprofile%\Links\Desktop\TV-Playlist_New.m3u"

set _cnt=0&& type nul >!_m3u_file_out!

for /f "tokens=* delims= " %%i in ('type !_m3u_file_in! ^|findstr /lbc:"#EXTINF:-" ^|findstr /r "[0-9][\,]" ') do (

    set "_old_=%%i"&& call set /a _cnt=!_cnt! + 1
    set "_new_=#EXTINF:-1,!_cnt!!_new:~10!"

)
echo/ Total lines replace: !_cnt!
move /y !_m3u_file_out! !_m3u_file_in!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...