Консультация № 190927
27.04.2017, 20:21
0.00 руб.
0 10 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Добрый день! Есть txt файл, который содержит след. информацию.
Подскажите пожалуйста, как удалить кусок текста и заменить на другую информацию.
Т.е мне нужно удалить содержимое, которое находится в $Log: и заканчивается $ и добавить новую информацию.
Пример:
Исходный файл:
/*
--------- Begin Version Control Data----------------------------------------
-- $URL:$
-- $Rev:$
-- $Date:$
-- $Author:$
-- $Log
sdfsdf
sdfsdfsd
fsdfsdf
sdf
-- $
--------- End Version Control Data -----------------------------------------
*/
Далее заменяем кусок текста(который находится в $Log: и заканчивается $) на любой текст и должны получить вот такой вариант
/*
--------- Begin Version Control Data----------------------------------------
-- $URL:$
-- $Rev:$
-- $Date:$
-- $Author:$
-- $Log
3423sdfsап
3453sdfsdвпвап
-- $
--------- End Version Control Data -----------------------------------------
*/

Обсуждение

давно
Мастер-Эксперт
259041
7459
28.04.2017, 04:14
общий
Адресаты:
Вы спросили: "как удалить кусок текста и заменить на другую информацию" - просто выделить удаляемый фрагмент (клавишу Shift удерживаем, клавиши вправо/влево, вверх/вниз указываем зону выделения), затем нажать Delete или вводить новый фрагмент.

Только я подозреваю, Вы не постарались сформулировать свой Вопрос, и Вам вероятно нужен скрипт, который при запуске открывает Ваш Пример.txt , находит 1 или неск-ко фрагментов $Log: ... $ и заменяет его контент, верно?
давно
Посетитель
400290
1
28.04.2017, 05:27
общий
Адресаты:
Да, Вы правы. Забыл написать, что нужно написать bat-скрипт.
Спасибо, что поправили!
давно
Мастер-Эксперт
259041
7459
28.04.2017, 13:44
общий
29.04.2017, 01:30
Адресаты:
"нужно написать bat-скрипт" - извините за грубость, но по-моему подозрению Вы снова ляпнули не подумавши. Потому что bat-язык - со времён Windows3.1 … Windows98 имеет очень ограниченные возможности. Даже его преемник cmd-файлы (Win2000/XP) не имеет инструмента "Регулярные выражения", с помощью которого можно легко найти и выпарсить Ваш фрагмент из $Log: … $ без проблем с кирилли-кракозябрами.

Я могу написать скрипт на VBS за 1 день, да и то если Вы потрудитесь задать исчерпывающ информацию (искать ли множество txt-файлов? Искать ли несколько $Log-блоков в каждом файле? Какой Тип запуска задачи Вы предпочитаете? Требуются ли админ-полномочия для программного изменения Вашего txt-файла?…). Корявый bat придётся писать предположительно 3 дня, я не буду убивать своё время на чьи-то причуды.

Определитесь с желаемым языком программирования и задайте свой вопрос в соответствующем разделе для программирования, например "JavaScript / VBScript, Создание программ на языках JavaScript и VBScript" https://rfpro.ru/ask/651
давно
Модератор
137394
1850
28.04.2017, 15:14
общий
28.04.2017, 15:32
Адресаты:
,
Исходный файл:
/*
--------- Begin Version Control Data----------------------------------------
-- $URL:$
-- $Rev:$
-- $Date:$
-- $Author:$
-- $Log
sdfsdf
sdfsdfsd
fsdfsdf
sdf
-- $
--------- End Version Control Data -----------------------------------------
*/
Не понимаю вопрос: если это весь текстовый файл, то зачем возиться с поиском куска -- $Log ..... -- $, тупо батником меняем содержимое файла на новое
Код:
@Echo Off
Set "Txt=text.txt"

(Echo /*
Echo --------- Begin Version Control Data----------------------------------------
Echo -- $URL:$
Echo -- $Rev:$
Echo -- $Date:$
Echo -- $Author:$
Echo -- $Log
Echo 3423sdfsап234
Echo 3453sdfsdвпвап
Echo -- $
Echo --------- End Version Control Data -----------------------------------------
Echo */
)>%Txt%
либо
Код:
@Echo Off
Set "Txt=text.txt"

Set "File=%~dpnx0"

FOR /F "usebackq Skip=2 tokens=1 delims=[]" %%n IN (`Find /N "@@@@@" "%File%"`) DO Set /A NSkip=%%n

>"%Txt%" more +%NSkip% "%File%"

GoTo :Eof

@@@@@@@@@@@@@@@@@@@@
/*
--------- Begin Version Control Data----------------------------------------
-- $URL:$
-- $Rev:$
-- $Date:$
-- $Author:$
-- $Log
3423sdfsап234
3453sdfsdвпвап
-- $
--------- End Version Control Data -----------------------------------------
*/
Или, еще проще, сделать новый текстовый файл с другим именем а затем скопировать его поверх старого, либо Вы не поставили задачу в полном объёме и это не весь текстовый файл а его кусок (тогда боевой текстовый файл хотелось бы получить)? В общем, будьте откровеннее и точнее в вопросе.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Мастер-Эксперт
259041
7459
29.04.2017, 18:09
общий
29.04.2017, 18:12
Адресаты:
Хоть Вы задали свой Вопрос не по адресу, наш главный скриптник, уважаемый Megaloman каким-то образом услышал Вас, и Вам теперь не обязательно пере-задавать свой Вопрос в скрип-раздел https://rfpro.ru/ask/651 .

Поскольку Вы не отвечаете на уточняющие вопросы, то Megaloman предложил Вам в помощь упрощённый код (без диалог-запросов типа "В каких путях искать Ваш текстовый исходник", и тд). Следуя его стилю, я написал простенький скрипт Корректор.vbs с комментариями, обрабатывающий "C:\Temp\Исходный файл.txt" с Вашим текстом. Распакуйте приложенный "Исходный файл.txt" в папку C:\Temp . Корректор.vbs можно распаковать куда хотите или запускать прямо из окна Вашей программы-архиватора.

Сейчас Корректор работает в демо-режиме: он не затирает исходник, а создаёт Правленный файл.txt и показывает его в Блокноте. Когда убедитесь в правильной замене строк, откройте Корректор.vbs не двойным щелчком, а из его контекстного меню выберите команду Изменить. В строке
f2="C:\Temp\Правленный файл.txt"
вставьте апостроф слева (перед f2), сохраните изменения, и после этого скрипт будет заменять Исходный докум вместо создания Правленного. Корректор проверен под WinXP и Win7.

P.S: Используйте апостроф с клавиши Кавычка (русская Э), а не с клавиши Тильда (рус Ё)!
Прикрепленные файлы:
a503ae7181143a86e0e69bbf2d921def.rar
давно
Мастер-Эксперт
259041
7459
01.05.2017, 16:54
общий
01.05.2017, 17:17
это ответ
Здравствуйте, Дмитрий !
В минифоруме Вашего Вопроса Вы уточнили, что Вам надо не просто "удалить кусок текста и заменить на др…", а "написать bat-скрипт", автоматизирующий операцию замены текстового блока. Bat-скрипты давно устарели изза своих ограниченных возможностей и систематических "глюков" с кириллицей и управляющими спец-символами. Писать на них - долгая и неблагодарная работа.

Я предпочитаю использовать VBScript, потому что большинство других языков программирования требуют установку специального ПрогОбеспечения (среда программирования, компилятор, редактор…). И если придётся подправить свою программу на чужом компьютере, учитывая пожелания конкретного клиента (например, чтоб значительно облегчить и ускорить настройку свеже-установленной ОперСистемы), то мало кому понравится, чтоб я на его машине устанавливал ненужные ему приложения. А для работы VBS нужны всего лишь WScript-обработчик и Блокнот, имеющиеся в любой ОС. Эти 2 файла даже искать не надо. Система сама загружает их по команде Запустить/Изменить (скрипт).

Итак, мы имеем Ваш ИсходныйФайл.txt и Заменитель.vbs . Как связать их и разработать алгоритм? К сожалению, Вы не ответили на уточняющие вопросы, и поэтому я по примеру уважаемого эксперта Megaloman принимаю простейшее предположение, будто Ваш документ расположен в популярном пути C:\Temp\ . Если это не так, Вы можете легко исправить путь во 2й строке скрипта. Для правки файла Заменитель.vbs надо из его контекстного меню (клик правой кнопкой мыши по значку файла в Проводнике) выбрать команду "Изменить". После правки надо Сохранить изменения экранной копии обратно в файл.

Если путь или имя документа не соответствуют прописке в скрипте, то исполняемый скрипт при попытке зачитать несоответствующий докум останавливается с выдачей ошиб-кода, мало-понятного начинающим пользователям. Для исключения "вылетов" полезно добавлять "Защиту от дурака", проверяющую существование прописанного документа и выдающую всем понятное сообщение при нестыковке.

Наличие документа проверили. Читаем файл. Тут тоже могут быть нюансы (кодировка юникод…), но Вы не прислали свой исходник, поэтому делаем, как наиболее вероятно и проще.

Чтоб "удалить содержимое, которое находится в $Log:" разрезаем докум-копию фрагментом, прописанным в переменной
s1=vbCrLf & "-- $Log" & vbCrLf
в 3й строке скрипта. Для страховки от случайных ошибок разреза я добавил к Вашему слову $Log: начало строки и окружающие символы переноса строки. Теперь если в Вашем большом исходнике будут ещё другие слова "$Log:" без символов "-- " слева и не окружённые переносами, то ошибочная замена в других блоках не произойдёт.

Аналогично разрезаем нижний отрезок фрагментом
s2=vbCrLf & "-- $" & vbCrLf
Получили 3 отрезка. Средний из них заменяем на
sn="Замененная строка1" & vbCrLf & "Замененная строка2"
Осталось "склеить" все 3 отрезка с добавлением разрезающих фрагментов.

Почти во всех строках скрипта я добавил для Вас поясняющие комментарии. Апостроф и всё, что правее него до конца строки, игнорируется обработчиком скрипта. Используем апостроф с клавиши Кавычка (русская Э), а не с клавиши Тильда (рус Ё)!

Распакуйте приложенный ИсходныйФайл.txt в папку C:\Temp . Заменитель.vbs можно распаковать куда хотите или запускать прямо из окна Вашей программы-архиватора. Сейчас Заменитель работает в демо-режиме: он не затирает исходник, а создаёт Правленный файл.txt в папке C:\Temp и открывает его в Блокноте на показ. Когда Вы убедитесь в правильной замене строк, откройте Заменитель.vbs из его контекста \ Изменить. Закомментируйте 9ю строку
f2="C:\Temp\Правленный файл.txt"
вставкой апострофа слева (перед f2), сохраните изменения, и после этого скрипт будет заменять ИсходныйФайл.txt вместо создания Правленного. Корректор проверен под WinXP и Win7.

Если у Вас много документов для замены, то удобно привязывать не докум к скрипту, а скрипт к папке SendTo . Под WindowsXP эта сис-папка расположена в пути C:\Documents and Settings\Вася\SendTo , а под Win7 и более поздних - в C:\Users\Вася\AppData\Roaming\Microsoft\Windows\SendTo (вместо Вася долж быть псевдоним учётки Пользователя, а вместо C: - возможна другая диск-буква с текущей ОС и папкой \Windows\ ).

Когда в папке SendTo Вы создадите ярлык, ссылающий на Заменитель.vbs , то любой файл в любом пути можно из его контекстного меню Отправить к Заменитель, и скрипт обработает отправленный к нему докум. Бывает очень удобно, когда например десятки сохранённых html-страниц я отправляю к HtmЧистка.vbs , где докумы очищаются от рекламного мусора, уменьшаются в размере в 10…20 раз и при открытии больше не лезут в интернет за докачкой реклам.

Конечно, возможны неожиданности, если Ваш исходник защищён от изменения атрибутами ТолькоДляЧтения или требует прав Админа для перезаписи. Тогда придётся добавить в скрипт соответствующие команды. Удачи.
Скачать >>
давно
Мастер-Эксперт
259041
7459
01.05.2017, 17:01
общий
Архив, прикреплённый к моему Ответу оказался пустым почему-то. Пожалуйста замените пустой архив на тот, что я прикрепляю к текущему посту.
Прикрепленные файлы:
7029daa87e5136ff34a1b9dd3dba47b2.zip
давно
Мастер-Эксперт
259041
7459
01.05.2017, 17:16
общий
Я удалил пустой архив из Ответа в надежде, что удастся прикрепить в следующем сеансе редактирования. Но кнопка "Прикрепить" отсутствует в форме редактора Ответа.
давно
Мастер-Эксперт
259041
7459
02.05.2017, 00:55
общий
Адресаты:
Большое Спасибо, Владимир, за Вашу помощь!
давно
Мастер-Эксперт
259041
7459
04.05.2017, 02:46
общий
Я должен предупредить желающих использовать мой скрипт для авто-замены текстовых блоков в своих файлах о том, что мой Заменитель.vbs - это упрощённо-учебная версия, написанная за 1 день, чтоб показать/пояснить, как происходит замена единственного блока. Если в ваших документах будет несколько одинаковых границ для выреза/замены блока, то скрипт может захватить и заменить не предусмотренную вами область, и таким образом испортить Ваш докум. Для обработки множественных либо вложенных блоков (html-тэгов) надо доработать скрипт и добавить возможность восстановить изменённый документ из его предвари-созданной резервной копии.
Форма ответа