1

Тема: CMD/BAT: Парсинг оператором for (Выборочная замена)

Использую следующий сценарий:

@echo off
setlocal enabledelayedexpansion
set infile=F:\test.conf
set find1=1
set replace1=2
set count=0
rem выбираю все содержимое файла
    for /F "tokens=* delims=," %%n in (!infile!) do (
rem "%%n" - весь файл
    set LINE=%%n
    set TMPR=!LINE:%find1%=%replace1%!
rem Именно здесь происходит замена текущей строки!
    Echo !TMPR!>>TMP.TXT
rem Добавляем строку к временному файлу 
                    )
rem Делаем резервное копирование исходного файла, на случай что что то пойдет не так…
copy %infile% %infile%.bak
rem Заменяем исходный файл временным
move TMP.TXT %infile%

В результате выполнения сценария из исходного test.conf со следующем содержанием:

1
1
1
1
1

получаю:

2
2
2
2
2

Хочу получить следующий результат:

1
1
2
1
1

То-есть замену произвести при третьем совпадении и дальше замену не производить. Подскажите пожалуйста, как можно допилить батничек?
Про ключ skip - в курсе, notepad++ не предлагать, про сторонние утилиты типа sed, gsar тоже, но для моего случая это не подходит...
Необходимо что-то типа вот этого:http://www.cyberforum.ru/csharp-beginne … 33200.html только bat, а не С#
Думаю может помочь вот эта информация: http://www.rsdn.ru/forum/dynamic/4600835.flat
Признаюсь честно, думал обойдется поиском в гугле, но увы я не смог, буду рад любым подсказкам...

2

Re: CMD/BAT: Парсинг оператором for (Выборочная замена)

У Вас в начале файла объявлена переменная count=0. Судя по имени - то, что доктор прописал, а Вы её не используете...

3

Re: CMD/BAT: Парсинг оператором for (Выборочная замена)

Я так понимаю, count может решить мою проблему? Помогите разобраться... как?

4

Re: CMD/BAT: Парсинг оператором for (Выборочная замена)

В переменную count записать количество найденных совпадений а потом выбрать, с каким произвести замену?
Как это можно сделать?

5

Re: CMD/BAT: Парсинг оператором for (Выборочная замена)

infodba пишет:

Я так понимаю, count может решить мою проблему?

Ну, имя переменной значения не имеет, просто Вам нужен счётчик, и тот, кто писал этот код, повидимому предполагал такую необходимость. Увеличивать значение переменной нужно внутри цикла for, а те действия, которые сейчас там выполняются - выполнять по условию if.

6

Re: CMD/BAT: Парсинг оператором for (Выборочная замена)

Мне бы примерчик....
Пишу:

...
SET COUNT=0
for /f "tokens=*" %%n in (!infile!) DO (
set /a count=!count!+1
set LINE=%%n
if !count! gtr 3 set TMPR=!LINE:%find1%=%replace1%!
Echo !TMPR!>>TMP.TXT
)
copy %infile% %infile%.bak
move TMP.TXT %infile%

Правильного результата не получается, может надо использовать еще и метки?
Переменную count я объявлял, чтоб экспериментировать подобным образом, но успехов как видно - не достиг... поэтому после многочисленного поиска - решил написать на форум <<знатокам>>

7

Re: CMD/BAT: Парсинг оператором for (Выборочная замена)

А когда count не gtr 3, TMPR у Вас чему равен? Кстати, почему gtr, а не equ?

infodba пишет:

замену произвести при третьем совпадении и дальше замену не производить

Наверное, надо как-то так (не проверял)

...
if !count! equ 3 set LINE=!LINE:%find1%=%replace1%!
Echo !LINE!>>TMP.TXT
...

8

Re: CMD/BAT: Парсинг оператором for (Выборочная замена)

Serge Yolkin пишет:

А когда count не gtr 3, TMPR у Вас чему равен?

Ну в результате выполнения получал файл:

ђҐ¦Ё¬ ўлў®¤  Є®¬ ­¤ ­  нЄа ­ (ECHO) ®вЄ«о祭.
ђҐ¦Ё¬ ўлў®¤  Є®¬ ­¤ ­  нЄа ­ (ECHO) ®вЄ«о祭.
ђҐ¦Ё¬ ўлў®¤  Є®¬ ­¤ ­  нЄа ­ (ECHO) ®вЄ«о祭.
1
1

То есть замена происходила во всех последующих совпадения (после трех найденных, которые затерлись "птичьим языком"). Мне этот вариант не подходит, хотя он наверное может где-то пригодиться, но думаю лучше указать с помощью ключа skip - с какой строки начинать, чтоб получить такой результат.

Serge Yolkin пишет:

Кстати, почему gtr, а не equ?

Потому что я noob...

Serge Yolkin пишет:

Наверное, надо как-то так (не проверял)

...
if !count! equ 3 set LINE=!LINE:%find1%=%replace1%!
Echo !LINE!>>TMP.TXT
...

Сергей Ёлкин, Вы абсолютно правы, я проверил - все работает, спасибо Вам.
Хотел спросить еще как заменить одну строку, тремя... постараюсь разобраться сам, но если не смогу опишу проблему в подробностях с примером ошибки. (не хочу флудить попусту)

9

Re: CMD/BAT: Парсинг оператором for (Выборочная замена)

Ну, почему же язык "птичий"? Там Вам вполне по-русски написано "Режим вывод  комнд на экран (ECHO) отключен.", что означает отсутствие аргумента у команды ECHO (на что я и намекал, интересуясь значением переменной TMPR). Просто для работы с пакетными файлами лучше использовать не Блокнот, а какую-нибудь альтернативу с поддержкой ДОС-кодировки, она же OEM, она же 866. Ещё можно в начале батника использовать команду CodePage: CP 1251. Вообще, для командного языка DOS/консоли Windows справка очень даже доступна: запустите cmd.exe (он-то и выполняет Ваши пакетные файлы) и наберите в его окне help...

10

Re: CMD/BAT: Парсинг оператором for (Выборочная замена)

В результате выполнения:

...
FOR /F "eol=; tokens=* delims=, " %%n in (!php.ini!) do (
...

в файле все-равно съедаются строки начинающиеся с  ; (точки с запятой)
Может кто-то сталкивался с подобной проблемой?

11

Re: CMD/BAT: Парсинг оператором for (Выборочная замена)

спасибо тем, кто старался помочь, ответ найден...