1

Тема: CMD/BAT: При замене текста удаляются пустые строки, а не должны

Доброго времени суток.
Помогите, пожалуйста.

Задача: изменить текст в txt-файле.
Решение:

 @echo off
cls
setlocal enabledelayedexpansion
:: указываем файл
    set file=.\WEB-INF\classes\tops\unicus\resources\unicus.properties
:: ввести строку для поиска
    set /p search=[enter text to search]
:: ввести строку для замены
    set /p change=[enter the text to change]
    @echo off
    setlocal enabledelayedexpansion
    set COUNT=0
:: ищем строку и заменяем
    for /F "usebackq tokens=*" %%s in (!file!) do (
            set LINE=%%s
            ::замена текущей строки
            set TMPR=!LINE:%search%=%change%!
            ::добавляем строку к временному файлу
            Echo.!TMPR!>>TMP.TXT                 
    )
    :: Делаем резервное копирование исходного файла, на случай что что то пойдет не так…
    copy %file% %file%.bak
    :: Заменяем исходный файл временным
    move TMP.TXT %file%

Проблема: при замене текста удаляются пустые строки, а не должны

Пробовала разные варианты, результат одинаковый: текст меняет и пустые строки удаляет.

Подскажите, пожалуйста, что делаю неправильно?
Заранее спасибо.

2 (изменено: Yury, 2014-02-06 19:21:32)

Re: CMD/BAT: При замене текста удаляются пустые строки, а не должны

@echo off
:: указываем файл
    set file=.\web-inf\classes\tops\unicus\resources\unicus.properties
:: ввести строку для поиска
    set /p search=[enter text to search]
:: ввести строку для замены
    set /p change=[enter the text to change]

 for /f %%i in ('find /c /v ""^<"%file%"') do set n=%%i
(
 for /l %%i in (1 1 %n%) do (
  set LINE=
  set /p "LINE="
  if defined LINE call set /p"=%%LINE:%search%=%change%%%"<nul
  if %%i==%n% goto exit
  echo.
 )
)<"%file%">tmp.txt

:exit
:: делаем резервное копирование исходного файла
    copy "%file%" "%file%.bak">nul
:: заменяем исходный файл временным
    move tmp.txt "%file%">nul
exit /b

3

Re: CMD/BAT: При замене текста удаляются пустые строки, а не должны

Yury, Большое спасибо.
Разбирала написанный Вами код, и к сожалению, не смогла найти ответы на некоторые возникшие вопросы.
Буду очень благодарна, если Вы на них ответите.

Разбор строки

for /f %%i in ('find /c /v ""^<"%file%"') do set n=%%i

Вопросы:

  1. Ключи команды find /c /v выполняют противоположные действия, подскажите, пожалуйста, правильно ли я понимаю, что при сочетании этих ключей получается более точные поиск искомой строки?

  2. Правильно ли я понимаю, что это "" обозначение пустой строки?

  3. Подскажите, пожалуйста, зачем выполняется экранирование ^<


Разбор строки

for /l %%i in (1 1 %n%) do (

Вопрос:

  • Подскажите, пожалуйста, что означает (1 1 %n%) ?


Разбор строки

set LINE=

Вопрос:

  • Подскажите, пожалуйста, это добавление пустой строки?


Разбор строки

set /p "LINE="

Вопрос:

  • Ключ /p означает ввод значения с клавиатуры, но в данном случае этого не происходит. Подскажите, пожалуйста, почему?


Разбор строки

if defined LINE call set /p"=%%LINE:%search%=%change%%%"<nul

Вопросы:

  1. Двойной процент %% означает вывод на экран символа %. Сомневаюсь, что в данном случае подразумевается именно вывод символа %. Расшифруйте, пожалуйста, назначение процентов в данной строке

  2. Сочетание >nul означает запрет вывода на экран команды и ее действия. Подскажите, пожалуйста, что означает сочетание <nul

Заранее спасибо.

4 (изменено: shiz, 2014-02-07 20:47:07)

Re: CMD/BAT: При замене текста удаляются пустые строки, а не должны

Ключи команды find /c /v выполняют противоположные действия, подскажите, пожалуйста, правильно ли я понимаю, что при сочетании этих ключей получается более точные поиск искомой строки?

Не правильно: ключ /v выполняет противоположное действие не ключу /c, а отсутствию ключа /v, т.е. подсчитывается число строк НЕ содержащих заданную.

Правильно ли я понимаю, что это "" обозначение пустой строки?

Правильно. Почему-то пустая строка считается не содержащейся ни в какой, т.е. просто подсчитывается количество всех строк.

Подскажите, пожалуйста, зачем выполняется экранирование ^<

Понимание приходит с опытом (и опытами). Не знаю даже, смогу ли объяснить словами. Вероятно потому, что < не попадает между двойных кавычек и перенаправление не относится к анализируемой в первую очередь команде (for).

Подскажите, пожалуйста, что означает (1 1 %n%) ?

То же самое, что и (1,1,%n%).

set LINE=

Подскажите, пожалуйста, это добавление пустой строки?

Следующей идёт команда set с ключом /p - если на её вход подать пустую строку, то переменная не сбросится, а сохранит старое значение. Поэтому в большинстве случаев перед set /p желательно удалить переменную.

Ключ /p означает ввод значения с клавиатуры, но в данном случае этого не происходит. Подскажите, пожалуйста, почему?

Ключ /p означает ввод строки из стандарного входного потока. В составной команде, содержащей set /p, в качестве входного потока используется файл с именем содержащимся в переменной %file%, т.е. ввод производится из этого файла:

(
 . . .
  set /p "LINE="
 . . .
)<"%file%">tmp.txt

Двойной процент %% означает вывод на экран символа %. Сомневаюсь, что в данном случае подразумевается именно вывод символа %. Расшифруйте, пожалуйста, назначение процентов в данной строке

Здесь используется команда call для отложенного раскрытия переменной (я, правда, предпочёл бы обозначение с восклицательными знаками).
Кое-что объясняется здесь: http://rsdn.ru/article/winshell/NTComma … .xml#EBUAE (не всё в этой статье стоит принимать на веру).

Сочетание >nul означает запрет вывода на экран команды и ее действия.

Вывода, но не действия.

Подскажите, пожалуйста, что означает сочетание <nul

Ввод из пустого потока (т.е. сразу достигается конец файла, при попытке всё-равно что-то прочесть возвращается пустая строка). О смысле использования с командой set /p см. тему CMD/BAT: вывод текста без переноса на новую строку.

Забыл пароль и потерял e-mail.

5

Re: CMD/BAT: При замене текста удаляются пустые строки, а не должны

shiz, большое спасибо.