29.05.2017, 23:53 [+3 UTC]
в нашей команде: 1 987 чел. | участники онлайн: 3 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: консультации

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.41 (25.02.2017)

Общие новости:
23.02.2017, 09:51

Форум:
29.05.2017, 18:14

Последний вопрос:
29.05.2017, 21:26

Последний ответ:
29.05.2017, 09:18

Последняя рассылка:
29.05.2017, 18:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

РАЗДЕЛ • Windows

Администрирование, установка, настройка, восстановление, командная строка и консоль ОС Windows.

[администратор рассылки: Андреенков Владимир (Профессор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 701
Megaloman
Статус: Академик
Рейтинг: 474
Елена Васильевна
Статус: Практикант
Рейтинг: 194

Перейти к консультации №:
 

Консультация онлайн # 190927
Раздел: • Windows
Автор вопроса: Дмитрий Соколов (Посетитель)
Отправлена: 27.04.2017, 20:21
Поступило ответов: 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 -----------------------------------------
*/

Состояние: Консультация закрыта

Здравствуйте, Дмитрий !
В минифоруме Вашего Вопроса Вы уточнили, что Вам надо не просто "удалить кусок текста и заменить на др…", а "написать 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 раз и при открытии больше не лезут в интернет за докачкой реклам.

Конечно, возможны неожиданности, если Ваш исходник защищён от изменения атрибутами ТолькоДляЧтения или требует прав Админа для перезаписи. Тогда придётся добавить в скрипт соответствующие команды. Удачи.
Скачать >>

Редактирование ответа
--------

• Отредактировал: Андреенков Владимир (Профессор)
• Дата редактирования: 01.05.2017, 17:17


Консультировал: Алексеев Владимир Николаевич (Советник)
Дата отправки: 01.05.2017, 16:54

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 190927
Алексеев Владимир Николаевич
Советник

ID: 259041

# 1

= общий = | 28.04.2017, 04:14 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Дмитрий Соколов:

Вы спросили: "как удалить кусок текста и заменить на другую информацию" - просто выделить удаляемый фрагмент (клавишу Shift удерживаем, клавиши вправо/влево, вверх/вниз указываем зону выделения), затем нажать Delete или вводить новый фрагмент.

Только я подозреваю, Вы не постарались сформулировать свой Вопрос, и Вам вероятно нужен скрипт, который при запуске открывает Ваш Пример.txt , находит 1 или неск-ко фрагментов $Log: ... $ и заменяет его контент, верно?

Дмитрий Соколов
Посетитель

ID: 400290

# 2

= общий = | 28.04.2017, 05:27 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Алексеев Владимир Николаевич:

Да, Вы правы. Забыл написать, что нужно написать bat-скрипт.
Спасибо, что поправили!

Алексеев Владимир Николаевич
Советник

ID: 259041

# 3

= общий = | 28.04.2017, 13:44 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Дмитрий Соколов:

"нужно написать bat-скрипт" - извините за грубость, но по-моему подозрению Вы снова ляпнули не подумавши. Потому что bat-язык - со времён Windows3.1 … Windows98 имеет очень ограниченные возможности. Даже его преемник cmd-файлы (Win2000/XP) не имеет инструмента "Регулярные выражения", с помощью которого можно легко найти и выпарсить Ваш фрагмент из $Log: … $ без проблем с кирилли-кракозябрами.

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

Определитесь с желаемым языком программирования и задайте свой вопрос в соответствующем разделе для программирования, например "JavaScript / VBScript, Создание программ на языках JavaScript и VBScript" http://rfpro.ru/ask/651

• Отредактировал: Алексеев Владимир Николаевич (Советник)
• Дата редактирования: 29.04.2017, 01:30

Megaloman
Академик

ID: 137394

# 4

= общий = | 28.04.2017, 15:14 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Дмитрий Соколов:

,

© Цитата:
Исходный файл:
/*
--------- 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 -----------------------------------------
*/
Или, еще проще, сделать новый текстовый файл с другим именем а затем скопировать его поверх старого, либо Вы не поставили задачу в полном объёме и это не весь текстовый файл а его кусок (тогда боевой текстовый файл хотелось бы получить)? В общем, будьте откровеннее и точнее в вопросе.

=====
Нет времени на медленные танцы

• Отредактировал: Megaloman (Академик)
• Дата редактирования: 28.04.2017, 15:32

Алексеев Владимир Николаевич
Советник

ID: 259041

# 5

= общий = | 29.04.2017, 18:09 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Дмитрий Соколов:

Хоть Вы задали свой Вопрос не по адресу, наш главный скриптник, уважаемый Megaloman каким-то образом услышал Вас, и Вам теперь не обязательно пере-задавать свой Вопрос в скрип-раздел http://rfpro.ru/ask/651 .

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

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

P.S: Используйте апостроф с клавиши Кавычка (русская Э), а не с клавиши Тильда (рус Ё)!

-----
 Прикрепленный файл:  скачать (RAR) » [1.6 кб]

• Отредактировал: Алексеев Владимир Николаевич (Советник)
• Дата редактирования: 29.04.2017, 18:12

Алексеев Владимир Николаевич
Советник

ID: 259041

# 6

= общий = | 01.05.2017, 17:01 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Модераторам:

Архив, прикреплённый к моему Ответу оказался пустым почему-то. Пожалуйста замените пустой архив на тот, что я прикрепляю к текущему посту.

-----
 Прикрепленный файл:  скачать (ZIP) » [2.0 кб]

Алексеев Владимир Николаевич
Советник

ID: 259041

# 7

= общий = | 01.05.2017, 17:16 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Модераторам:

Я удалил пустой архив из Ответа в надежде, что удастся прикрепить в следующем сеансе редактирования. Но кнопка "Прикрепить" отсутствует в форме редактора Ответа.

Алексеев Владимир Николаевич
Советник

ID: 259041

# 8

= общий = | 02.05.2017, 00:55 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Андреенков Владимир:

Большое Спасибо, Владимир, за Вашу помощь!

Алексеев Владимир Николаевич
Советник

ID: 259041

# 9

= общий = | 04.05.2017, 02:46 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Я должен предупредить желающих использовать мой скрипт для авто-замены текстовых блоков в своих файлах о том, что мой Заменитель.vbs - это упрощённо-учебная версия, написанная за 1 день, чтоб показать/пояснить, как происходит замена единственного блока. Если в ваших документах будет несколько одинаковых границ для выреза/замены блока, то скрипт может захватить и заменить не предусмотренную вами область, и таким образом испортить Ваш докум. Для обработки множественных либо вложенных блоков (html-тэгов) надо доработать скрипт и добавить возможность восстановить изменённый документ из его предвари-созданной резервной копии.

 

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

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.16018 сек.

© 2001-2017, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.41 от 25.02.2017
Бесплатные консультации онлайн