Войти

Показать полную графическую версию : Как добавить текст в середину текстрового файла


Страниц : 1 2 [3]

Iska
23-04-2011, 10:28
Foreigner, виденные мною примеры были куда как длиннее (там, конечно, было не только чтение, а весь набор операций по чтению, записи, созданию, удалению файла, секций, параметров и значений). Не скажу, что увиденное мною выглядело наглядно, скорее наоборот.

BigBoo
03-04-2012, 14:07
For /F "Tokens=2*" %%I In ('Reg Query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /V Personal') Do Set Personal=%%J
start "" /wait "nircmd.exe" inisetval "%AppData%\Opera\Opera\operaprefs.ini" "User Prefs" "Download Directory" "%Personal%\Закачки"
В итоге в operaprefs.ini: Download Directory=F:\ 𐆿𐊺𐊶𐉶\Ƞ롷릍
Как решить проблему с кодировкой, чтобы было F:\Мои документы\Закачки

AdBes
06-02-2014, 17:41
Доброго времени суток.
Помогите, пожалуйста.

Задача: изменить текст в 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%


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

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

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

Georgio
06-02-2014, 19:29
@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

AdBes
07-02-2014, 13:05
Georgio, Большое спасибо.
Разбирала написанный Вами код, и к сожалению, не смогла найти ответы на некоторые возникшие вопросы.
Буду очень благодарна, если Вы на них ответите.

Разбор строки
for /f %%i in ('find /c /v ""^<"%file%"') do set n=%%i
Вопросы:

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



Разбор строки
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
Вопросы:

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


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

Iska
07-02-2014, 13:58
Ключи команды find /c /v выполняют противоположные действия, подскажите, пожалуйста, правильно ли я понимаю, что при сочетании этих ключей получается более точные поиск искомой строки? »
Нет. Командой «find /c /v ""^<"%file%"» осуществляется подсчёт числа строк во входном файле «%file%». «/v ""» используется для вывода всех строк, а «/c» их считает.
/V Вывод всех строк, НЕ содержащих заданную строку.
/C Вывод только общего числа строк, содержащих заданную строку.
Затем в цикле «for /f» производится разбор вывода команды «find», и выведенное ею число строк файла «%file%» присваивается переменной окружения «n».

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

Подскажите, пожалуйста, зачем выполняется экранирование ^< »
Потому что иначе символ перенаправления «<» будет воспринят циклом разбора «for /f», а не передан команде «find».

Подскажите, пожалуйста, что означает (1 1 %n%) ? »
FOR /L %переменная IN (начало,шаг,конец) DO команда [параметры]

Набор раскрывается в последовательность чисел с заданными началом, концом и шагом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5), а набор (5,-1,1) заменяется на (5 4 3 2 1).

В данном случае «%%i» будет раскрываться, начиная с «1», с шагом «1» и до полученного числа строк файла «%file%», которое было выше сохранено в переменной окружения «n».

Подскажите, пожалуйста, это добавление пустой строки? »
Нет. Это удаление переменной окружения «LINE».

Ключ /p означает ввод значения с клавиатуры, но в данном случае этого не происходит. Подскажите, пожалуйста, почему? »
Потому что значимым здесь является весь блок команд:
(
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

и ввод в «set /p "LINE="» осуществляется из файла «%file%», а вывод из того же блока команд — в файл «tmp.txt». Ввод в «set /p "LINE="» при этом осуществляется построчно — по одной строке на каждом цикле прохода «for /l».

Двойной процент %% означает вывод на экран символа %. »
Не означает вывод. Рассматривайте команду:
… call set /p"=%%LINE:%search%=%change%%%"<nul
целиком. Она распадается на две команды — собственно вызов «call» и вычисляемая при его вызове подкоманда «set /p"=%LINE:«Здесь вычисленное при вызове call значение переменной окружения «search»»=«Здесь вычисленное при вызове call значение переменной окружения «change»»%"<nul».

Сочетание >nul означает запрет вывода на экран команды и ее действия. »
Тоже неверное толкование. «>nul» означает перенаправление стандартного потока вывода команды в пустое устройство («nul»). Именно поэтому видимым следствием такого перенаправления может быть отсутствие вывода команды на экран.

Подскажите, пожалуйста, что означает сочетание <nul»
Обратное. «<nul» — перенаправление стандартного потока ввода команды на ввод из пустого устройства («nul»). Для любой команды, ожидающей ввода строки из стандартного потока ввода, сие означает ввод пустой строки.

Констатируя, можем сказать, что в данном случае вся строка:
if defined LINE call set /p"=%%LINE:%search%=%change%%%"<nul
означает примерно следующее:
Если переменная окружения LINE существует (т.е., очередная строка текста из файла «%file%», сохранённая в «LINE», оказалась не пуста), то вывести эту строку (<nul set /p Var=%LINE%), заменив в ней «search» на «change».

AdBes
10-02-2014, 11:28
Iska, большое спасибо.




© OSzone.net 2001-2012