ReplaceByRegular

ReplaceByRegular - Замена текста через регулярные выражения во множестве файлов 1.12

  • Автор темы Автор темы Dragokas
  • Дата начала Дата начала

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
8,030
Решения
12
Реакции
6,805
=======================================
ReplaceByRegular by Dragokas
=======================================

- Скрипт для замены текста во множестве файлов согласно регулярным выражениям.

Состав:
Regular.txt - список замен
ReplaceByRegular.vbs - сам скрипт
Readme.txt - этот файл.


Как пользоваться?

1)
Копируете файл Regular.txt и ReplaceByRegular.vbs
в папку, где нужно рекурсивно (с подкаталогами) провести замены текста.

Текст может быть в кодировках:
- ANSI
- UTF-8

2)
Откройте Regular.txt (должен лежать рядом со скриптом).
Создайте перечень замен вида:

word1=Что ищем1
word2=Чем заменяем1
word1=Что ищем2
word2=Чем заменяем2

где каждому word1= соостветствует word2=, который под ним находится.
Так, Вы можете сделать одновременно несколько разных замен.

word1= принимает для поиска регулярное выражение (писать после знака равенства).
word2= принимает текст, на который будет произведена замена части, найденной регуляркой, указанной в word1=

3) Запускаем скрипт ReplaceByRegular.vbs

Отчет о заменах будет создан в виде файла Replace - log.log рядом со скриптом.

--------------
Настройки
--------------

1) Список расширений

Скрипт обрабатывает только файлы с расширениями, список которых указан в его шапке.
Правый клик по файлу ReplaceByRegular.vbs -> "Изменить"
Смотрим сюда (строка 5):

Dim Exts: Exts = "htm;html;txt"

2) Замена с учетом регистра букв.
Если Вы хотите включить учёт регистра при поиске по регулярному выражению:
Правый клик по файлу ReplaceByRegular.vbs -> "Изменить"
Смотрим сюда (строка 11):

Dim IgnoreCase: IgnoreCase = true

и меняем true на false


---------------

В word1 действуют некоторые правила экранирования. Так:

\\ будет заменен на \
\^ будет заменен на ^
\$ будет заменен на $
\* будет заменен на *
\+ будет заменен на +
\? будет заменен на ?
\. будет заменен на .
\| будет заменен на |
\n будет заменен на новую строку
\r будет заменен на перевод каретки
\t будет заменен на знак табуляции

Также есть 2 специальные замены:

1)

$$$file$$$ будет заменено на имя файла (+ расширение имени), в котором найдена искомая фраза.

Например, если файл назывался my.txt
а шаблоны такие:
word1=\<a href="default\.htm"\>
word2=<a href="$$$file$$$">

то
<a href="default.htm">
будет заменено на:
<a href="my.txt">

2)

\@{{{utf8toANSI}}}

означает, что искомая фраза будет перекодирована из кодировки utf-8 в ANSI,
где \@ - это подстановка искомой фразы.


Например, имеем текст в utf-8:
<title>Привет, regist</title>

После применения шаблона:
word1=<title>[^<]*</title>
word2="\@"{{{utf8toANSI}}}

Результат будет ANSI-строка (в кавычках):
"<title>Привет, regist</title>"

3)

\@{{{ANSItoUTF8}}}

означает, что искомая фраза будет перекодирована из кодировки ANSI в utf-8,
где \@ - это подстановка искомой фразы.

Например, имеем текст в ANSI:
<title>Привет, regist</title>

После применения шаблона:
word1=<title>[^<]*</title>
word2="\@"{{{ANSItoUTF8}}}

Результат будет UTF-8 строка (в кавычках):
"<title>Привет, regist</title>"

Обратите внимание, метка BOM автоматически не добавляется.
Некоторые редакторы могут неверно распознать исходный формат текстового файла.


P.S. "Я не люблю писать любые виды документации" (© Boban Spasic), но конкретно ЭТУ меня заставил написать regist и я ему это припомню :)
Вообщем, спасибо ему за разминку мозгов, по причине которой и родился этот скрипт.

Скрипт сподвигнул написать regist.
 

Вложения

Последнее редактирование:
2) Замена с учетом регистра букв.
Если Вы хотите отключить учет регистра при поиске по регулярному выражению:
лучше по умолчанию отключи учёт регистра букв. Посоветовал скрипт на другом форуме, так отработал не с первого раза из-за того, что title заглавными буквами был написан.
 
Готово.
 
Обновлено до v1.8.2
Добавлен шаблон \@{{{ANSItoUTF8}}} - замена кодировки фразы поиска с ANSI на UTF-8.
 
Пользователь Dragokas разместил новый ресурс:

ReplaceByRegular - Замена текста через регулярные выражения во множестве файлов

=======================================
ReplaceByRegular by Dragokas
=======================================

- Скрипт для замены текста во множестве файлов согласно регулярным выражениям.

Состав:
Regular.txt - список замен
ReplaceByRegular.vbs - сам скрипт
Readme.txt - этот файл.

Как пользоваться?

1)
Копируете файл Regular.txt и ReplaceByRegular.vbs
в папку, где нужно рекурсивно (с подкаталогами) провести замены текста.

Текст может быть в кодировках:
- ANSI
- UTF-8

2)...

Узнать больше об этом ресурсе...
 
А есть возможность добавить GUI?
 
и превратить простенький VBS скрипт который правишь на свой вкус в непонятный .exe на который ещё будут ругаться антивирусы.
akok, ты хоть пользовался им?
 
akok, можно, но я не сильно люблю клепать интерфейсы, даже простенькие, и это уже будет не скрипт, а программа.
Если сильно нужно, то сделаю альтернативу.
 
Если сильно нужно
для того чтобы было сильно нужно, надо этим пользоваться. А подозреваю, что это просто была хотелка, что неплохо прикрутить такую свистелку возможно другим она будет нужна.
А если пользоваться, то там всё очень удобно.
 
А подозреваю, что это просто была хотелка, что неплохо прикрутить такую свистелку возможно другим она будет нужна.
А если пользоваться, то там всё очень удобно.
Хотелка. Просто посмотри на ситуацию обычного обывателя, им удобнее через интерфейс, обычные юзеры скриптов как огня боятся. А так да, возни много + возможные детекты... если сложно, то пусть будет как есть.
 
akok,
1) Обычному пользователю который боится скриптов как огня этот скрипт не нужен (ни в виде скрипта ни в виде .exe).
2) Скрипт проверен на практике и мной и другими пользователями и оказался очень удобным. Собственно он и родился из практической задачи.
Так что это надуманная хотелка на практике не нужна, а минусы имеет.
возможные детекты
не возможные, а гарантированные. Прога по поведению ведь похожа на шифратор. И детекты на подобные утилиты есть даже на широко и давно используемые.
 
Dragokas обновил(а) ресурс ReplaceByRegular новой записью:

Обновления

1.9
Добавлена поддержка формата UTF-16LE с BOM (определяется автоматически)
Добавлена возможность задавать путь к файлу (или папке для обработки файлов) в качестве аргумента командной строки - cscript.exe ReplaceByRegular.vbs "путь"

Узнать больше об этом обновлении...
 
При использование вышло эта ошибка
Как можно исправить.
 

Вложения

  • .webp
    .webp
    10.1 KB · Просмотры: 160
Привет.
Попробуй сейчас.
 
Отработало. Но маленько не так.
На входе

Код:
word1=Byte
word2=Bytee
word1=Int16
word2=Int1616
word1=Int32
word2=Int3232
word1=Int64
word2=Int6464


получаю
Код:
extern const Byteeeeeeeeeeeeee k7zSignature[k7zSignatureSize];
const Byte *Data;
UInt3232323232323232323232323232323232323232323232323232 MethodID;
Byte NumStreams;
UInt32 NumCoders;
и так далее.

Я просто хочу исходник от 7z маленько тип данных поменять

Пример вот это
typedef unsigned char Byte;
typedef short Int16;
typedef unsigned short UInt16;

#ifdef _LZMA_UINT32_IS_ULONG
typedef long Int32;
typedef unsigned long UInt32;
#else
typedef int Int32;
typedef unsigned int UInt32;
#endif

#ifdef _SZ_NO_INT_64

/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
NOTES: Some code will work incorrectly in that case! */

typedef long Int64;
typedef unsigned long UInt64;

#else

#if defined(_MSC_VER) || defined(__BORLANDC__)
typedef __int64 Int64;
typedef unsigned __int64 UInt64;

#else
typedef long long int Int64;
typedef unsigned long long int UInt64;

#endif

#endif

#ifdef _LZMA_NO_SYSTEM_SIZE_T
typedef UInt32 SizeT;
на это
typedef unsigned char Bytee;
typedef short Int1616;
typedef unsigned short UInt1616;

#ifdef _LZMA_UINT32_IS_ULONG
typedef long Int3232;
typedef unsigned long UInt3232;
#else
typedef int Int3232;
typedef unsigned int UInt3232;
#endif

#ifdef _SZ_NO_INT_64

/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
NOTES: Some code will work incorrectly in that case! */

typedef long Int6464;
typedef unsigned long UInt6464;

#else

#if defined(_MSC_VER) || defined(__BORLANDC__)
typedef __int64 Int6464;
typedef unsigned __int64 UInt6464;
#define UINT64_CONST(n) n
#else
typedef long long int Int6464;
typedef unsigned long long int UInt6464;
#define UINT64_CONST(n) n ## ULL
#endif

#endif

#ifdef _LZMA_NO_SYSTEM_SIZE_T
typedef UInt3232 SizeT;
и так в каждом файле.
 
Последнее редактирование:
Модель движка замен изначально была спроектирована неправильно.
Благо, легко исправляется.
Проверяй.
 
ЗЫ. Добавил фичу, чтобы в логе замен отображался порядковаый номер символа, где найдена фраза.
 
@Alex1983, не торопись. Пришлось делать кое-какие перерасчёты, чтобы правильно вычислить индексы для замен.

Вот новая версия, и должно быть последняя.
+ здесь в отчёте формируется уже не индекс символа, а № строки, в которой найдена фраза.

Да, ещё, не забудь в скрипте отключить игнорирование регистра символов (и соответственно, регулярку тоже правильно составь с учётом этого), а то при компиляции на C++ начнутся проблемы.

// Часть сообщений перенесена в тему: https://safezone.cc/threads/reguljarnoe-vyrazhenie-dlja-zameny-tipov-dannyx.30864/
 
Последнее редактирование:
Dragokas обновил(а) ресурс ReplaceByRegular новой записью:

Обновление

1.12
Исправлена ошибка в движке замены (при некоторых условиях могли происходить двойные замены)
Добавлен вывод в лог замен номера строки, в которой найдена фраза.

Узнать больше об этом обновлении...
 
Назад
Сверху Снизу