Эта страница содержит справочную информацию об использовании программы nhreplace. Информация относится к новой версии программы.

Поиск и замена обычного текста

Поиск и замена по регулярному выражению

Замена текста по списку действий

Смена кодировки файла

Замена текста в потоке stdin

Список всех параметров

Поиск и замена обычного текста

При запуске со следующими параметрами программа выполняет поиск простого текста (plain text):

nhrt.exe -spt:<plain text>|-set:<escape text> [-i] [-occ:<вхождения>] [-r] -t:<plain text>|-et:<escape text>|-f:<filename>[,<codepage>] [-cp:<codepage>[,<codepage>]] [-o:(q|s|d*)] [-notitle] <mask>...

Текст для поиска может быть задан обычным текстом или текстом с управляющими символами.

Текст для замены может быть задан статическим текстом: обычным текстом, текстом с управляющими символами или содержимым текстового файла.

Одновременно с заменой может быть выполнено преобразование кодировки файлов.

Поиск и замена по регулярному выражению

При запуске со следующими параметрами программа выполняет поиск текста по регулярному выражению (regular expression):

nhrt.exe -sre:<regexp> [-i] [-occ:<вхождения>] [-r] -t:<plain text>|-et:<escape text>|-ft:<formatted text>|-f:<filename>[,<codepage>] [-cp:<codepage>[,<codepage>]] [-o:(q|s|d*)] [-notitle] <mask>...

Текст для поиска может быть задан регулярным выражением.

Текст для замены может быть задан статическим текстом (обычным текстом, текстом с управляющими символами или содержимым текстового файла) или выражением (форматированным текстом с флагами $).

Одновременно с заменой может быть выполнено преобразование кодировки файлов.

Замена текста по списку действий

При запуске с параметром -list программа выполняет сразу несколько операций поиска и замены текста, перечисленных в текстовом файле:

nhrt.exe -list:<replace file>[,<codepage>] [-r] [-cp:<codepage>[,<codepage>]] [-o:(q|s|d*)] [-notitle] <mask>...

В файле со списком действий могут быть указаны различные операции:

-spt:<plain text>|-set:<escape text> [-i] -t:<plain text>|-et:<escape text>|-f:<filename>[,<codepage>]
-sre:<regexp> [-i] -t:<plain text>|-et:<escape text>|-ft:<formatted text>|-f:<filename>[,<codepage>]

Обработка файла по списку замен

  • быстрее, когда выполняется несколько разных поисков/замен в одном файле, потому что они выполняются за одну загрузку файла, в отличие от нескольких запусков программы
  • проще для записи – в списке указываются только сами замены, а общие параметры, такие как имена файлов и их кодировка, задаются один раз в командной строке
  • обрабатывает особые символы, которые нельзя или сложно использовать в командной строке — амперсанд &, крышка ^ и другие

Смена кодировки файла

При запуске со следующими параметрами программа выполняет преобразование кодировки файлов без изменения содержания текста:

nhrt.exe -cp:<кодовая страница>,<кодовая страница> [-notitle] [-o:q[uiet]|s[hort]|d[etailed]*] [-r] <маска>...

Замена текста в потоке stdin

Программа выполняет замену текста в стандартном потоке STDIN с выводом в STDOUT, если в командной строке не заданы файлы для обработки.

Поиск простого текста:

nhrt.exe -spt:<plain text>|-set:<escape text> [-i] -t:<plain text>|-et:<escape text>|-f:<filename>[,<codepage>] 
[-notitle]

Поиск по регулярному выражению:

nhrt.exe -sre:<regexp> [-i] -t:<plain text>|-et:<escape text>|-ft:<formatted text>|-f:<filename>[,<codepage>] 
[-notitle]

Замена по списку действий:

nhrt.exe -list:<replace file>[,<codepage>] [-notitle]

Список всех параметров

Полный список всех параметров:

-spt, -searchplaintext

Искать простой текст.

Текст можно задавать без кавычек, если он не содержит пробелов.

Текст с пробелами должен быть заключен в кавычки. К параметру будет относиться все символы до кавычки, после которой есть пробел или которая находится в конце строки. Поэтому текст может содержать кавычки, если после кавычек не идёт пробел, и эти кавычки не требуют экранирования.

-spt:текст
-spt:"текст с пробелами"
-spt:"файл "справка 0248.txt""

-set, -searchescapetext

Искать простой текст с поддержкой символов \",\r,\n,\xHH,\\uHHHH

Текст можно задавать без кавычек, если он не содержит пробелов.

Текст с пробелами должен быть заключен в кавычки. Текст может содержать кавычки, но они должны быть экранированы обратной наклонной чертой (backslash \).

-set:"файл \"справка 0248.txt\""
-set:\u00A9

-spf, -searchplainfile

Искать простой текст по содержимому текстового файла.

Этот параметр был добавлен в nhrt v2.10.

Этот параметр удобнее для многострочного текста или для текста, где требуется экранировать много символов, по сравнению с spt или set.

Формат:

-spf:<имя файла>[,<кодировка файла>]

Использует содержимое указанного файла как простой текст для поиска.

Кодировка файла может иметь следующие значения: Auto* | ANSI | OEM | UCS-2LE | UCS2-LE_BOM | UTF-8 | UTF-8_BOM | Unicode | число. По умолчанию используется значение Auto. Символы тире и подчеркивания необязательны, например, ucs2lebom будет эквивалентно UCS2-LE_BOM.

Примеры:

nhrt.exe -spf:1.txt,utf8 -t:"заменяющий текст"
nhrt.exe -spf:2.txt -f:2a.txt

Параметр spf

  • работает как в командной строке nhrt, так и в файле, заданном параметром list
  • нельзя использовать одновременно с -spt, -sre, srf

-sre, -searchregularexpression

Искать регулярное выражение ECMAScript. Пример поиска по регулярному выражению см. в статье Изменение формата дат

-srf, -searchregularexpressionfile

Этот параметр был добавлен в nhrt v2.10.

Искать по регулярному выражению, заданному в текстовом файле.

Этот параметр удобнее для многострочного текста, по сравнению с sre.

Формат:

-srf:<имя файла>[,<кодировка файла>]

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

Кодировка файла может иметь следующие значения: Auto* | ANSI | OEM | UCS-2LE | UCS2-LE_BOM | UTF-8 | UTF-8_BOM | Unicode | число. По умолчанию используется значение Auto. Символы тире и подчеркивания необязательны, например, ucs2lebom будет эквивалентно UCS2-LE_BOM.

Примеры:

nhrt.exe -srf:1.txt,utf8 -t:"заменяющий текст"
nhrt.exe -srf:2.txt -f:2a.txt

Параметр srf

  • работает как в командной строке nhrt, так и в файле, заданном параметром list
  • нельзя использовать одновременно с -spt, -sre, spf

-occ, -occurences

Этот параметр добавлен в версии 2.12.

Используется совместно с -spt, -set или -sre и задаёт замену по номеру вхождения, например:

-occ:"2,4,6-8,-3,-1"
  • положительные значения — нумерация с начала текста, 1 — первое вхождение и так далее.
  • положительные значения можно указывать диапазоном, например, 6-8
  • отрицательные значения — нумерация с конца текста, -1 — самое последнее вхождения, -2 — предпоследнее и так далее.

-list:имя_файла[,кодировка]

Взять список замен из файла, а не из параметров командной строки.

Этот параметр добавлен в версии v2.5.

Файл содержит по одной замене на строку, в каждой строке используются те же параметры -spt/-sre и т.д.

Кодировка файла определяется автоматически по BOM и содержимому, кроме OEM. Также кодировку можно указать явно.

-i, -ignorecase

Не различать верхний и нижний регистр.

-insert_before

Этот параметр добавлен в nhrt v2.11.

При указании этого параметра программа вставляет текст, заданный параметрами -t, -et или -f, перед каждым вхождением искомого текста (а не выполняет замену).

-insert_before используется совместно с -spt, -set, -spf, -sre, -srf как в командной строке, так и в списке команд, заданным параметром -list.

Параметр нельзя использовать одновременно с -insert_after.

Поддерживаются также формы записи:

  • без подчёркивания insertbefore
  • сокращённая ib

-insert_after

Этот параметр добавлен в nhrt v2.11.

При указании этого параметра программа вставляет текст, заданный параметрами -t, -et или -f, после каждого вхождения искомого текста (а не выполняет замену).

-insert_after используется совместно с -spt, -set, -spf, -sre, -srf как в командной строке, так и в списке команд, заданным параметром -list.

Параметр нельзя использовать одновременно с -insert_before.

Поддерживаются также формы записи:

  • без подчёркивания insertafter
  • сокращённая ia

-t, -text

Задает простой текст для замены.

Текст можно задавать без кавычек, если он не содержит пробелов.

Текст с пробелами должен быть заключен в кавычки. К параметру будет относиться все символы до кавычки, после которой есть пробел или которая находится в конце строки. Поэтому текст может содержать кавычки, если после кавычек не идёт пробел, и эти кавычки не требуют экранирования.

-t:текст
-t:"текст с пробелами"
-t:"файл "справка 0248.txt""

-e, -erase

Удаление текста (то же самое, что и -t:"").

-et, -escapetext

Задает простой текст с поддержкой символов \",\r,\n,\\,\xHH,\uHHHH для замены. Параметр -et добавлен в версии v2.7.0.

\" – кавычки,

\r – возврат каретки (carriage return) — CR, код 0x0D,

\n – новая строка (line feed) — LF, код 0x0A,

\xHH – символ, заданный двузначным шестнадцатиричным кодом, например, \x07 означает символ BEL. Удобно для указания непечатаемых ASCII символов, подробнее см. ASCII. Пример использования см. в статье ping со звуковым сигналом.

\uHHHH – символ, заданный четырёхзначным шестнадцатиричным кодом, например, \u215C означает символ дроби . Удобно для указания Unicode символов.

Текст можно задавать без кавычек, если он не содержит пробелов.

Текст с пробелами должен быть заключен в кавычки. Текст может содержать кавычки, но они должны быть экранированы обратной наклонной чертой (backslash \).

-et:"файл \"справка 0248.txt\""
-et:"\u00A9"

-ft, -formattedtext

Задает форматированный текст для замены регулярных выражений. Найденные группы обозначаются как $1, $2 и т.д.

Параметр -ft добавлен в версии v2.8.0.

Пример применения см. в статьях Замена текста с использованием результатов поиска по регулярному выражению, Изменение формата дат, Преобразование CSV файла в файл запросов SQL

-fet, -formattedescapetext

Задает форматированный текст для замены регулярных выражений. Найденные группы обозначаются как $1, $2 и т.д. Поддерживает escape characters: \",\r,\n,\\,\xHH,\uHHHH .

Параметр -ft добавлен в версии v2.9.0.

-f, -file

Задает файл для замены.

-o, -outputlevel

Задает режим вывода:
q Тихий режим (нет вывода)
s Краткие сведения
d Подробные сведения: каждый файл и число замен

-r, -recursive

Параметр -r задает замену текста также в файлах во вложенных папках.

Пример замены текста в файлах t12*.txt в текущем каталоге и подкаталогах:

nhrt -spt:"текст для поиска" -t:"текст для замены" -r t12*.txt

-cp, -codepage

Кодовые страницы для чтения и записи: Auto* | ANSI | OEM | UCS-2LE | UCS2-LE_BOM | UTF-8 | UTF-8_BOM | Unicode | число.

Параметр <кодовая страница> может иметь следующие значения: Auto* | ANSI | OEM | UCS-2LE | UCS2-LE_BOM | UTF-8 | UTF-8_BOM | Unicode | число. По умолчанию используется значение Auto. Символы тире и подчеркивания необязательны, например, ucs2lebom будет эквивалентно UCS2-LE_BOM.

Описание значений подробнее.

Код возврата

Код возврата 0

Заменена 1 или более строк или преобразован 1 или более файлов

Код возврата 1

Не найден указанный текст или преобразование кодировки не требуется.

Код возврата 2

Ошибка в параметрах, не найден файл или другая ошибка.

Указание кодовой страницы

Параметр <кодовая страница> может иметь следующие значения: Auto* | ANSI | OEM | UCS-2LE | UCS2-LE_BOM | UTF-8 | UTF-8_BOM | Unicode | число. По умолчанию используется значение Auto. Символы тире и подчеркивания необязательны, например, ucs2lebom будет эквивалентно UCS2-LE_BOM.

ANSI

8-битная кодировка, используемая не Unicode приложениями с графическим интерфейсом. Зависит от настроек Windows и на разных компьютерах может соответствовать различным значениям, например, 1251 в русской версии и 1252 в западноевропейских, что приводит к неправильному отображения текста на западноевропейских языках (немецкий, французский и т.д.) в русской Windows и наоборот.

OEM

8-битная кодировка, используемая не Unicode приложениями с консольным интерфейсом. Зависит от настроек Windows и на разных компьютерах может иметь различные значения. Например, в русской версии Windows кодировка OEM соответствует 866.

UCS-2-LE

Двухбайтовая кодировка Little Endian без BOM, см. UTF-16. Это значение добавлено в версии v2.9.0.

UCS-2-LE_BOM

Двухбайтовая кодировка Little Endian с BOM, см. UTF-16. Это значение добавлено в версии v2.9.0.

Unicode

Обозначение соответствует UCS-2-LE_BOM, т.е. двухбайтовая кодировка Little Endian с BOM. Программа может считывать Unicode файлы с BOM (Byte Order Mark) или без BOM, запись производится всегда с BOM.

UTF-8

Кодировка UTF-8 без BOM.

Начиная с версии v2.9.0, значение было изменено: теперь это строго UTF-8 без BOM. Для записи UTF-8 с BOM следует использовать значение UTF-8_BOM (см. далее). В версиях по v2.8.1 обозначение UTF-8 трактовалось как запись с BOM.

UTF-8_BOM

Кодировка UTF-8 с BOM. Это значение добавлено в версии v2.9.0.

Номер кодировки, например, 1251, 1252 и т.д.

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

auto

Когда значение auto указано для существующего файла (обрабатываемого или используемого для замены), программа пытается автоматически определить кодировку:

  • файлы Unicode определяются по BOM или содержимому,
  • файлы UTF-8 определяются по BOM или содержимому,
  • если файл не UTF-8 и не Unicode, он считается ANSI.

Автоматически определить OEM программа не может.

Когда значение auto указано для результирующего файла, оно означает, что кодировка изменена не будет, т.е. останется как у исходного.

См. также

Если вы не нашли необходимую информацию по программе nhrt на этой странице, вы можете посмотреть ответы на часто задаваемые вопросы по nhrt или написать комментарий внизу страницы.

Если программа работает не так, как ожидается или при работе возникает ошибка, вы можете воспользоваться форумом поддержки nhrt.

Справка nhrt: 24 комментария

  • 02.10.2018 в 11:26
    Постоянная ссылка

    Доброе)
    Имеется код
    @echo off
    nhrt.exe -s:"text1" -r -f:1.txt *.htm *.html
    nhrt.exe -s:"text2" -r -f:2.txt *.htm *.html
    nhrt.exe -s:"text3" -r -f:3.txt *.htm *.html
    nhrt.exe -s:"text4" -r -f:4.txt *.htm *.html
    nhrt.exe -s:"text5" -r -f:5.txt *.htm *.html
    nhrt.exe -s:"text6" -r -f:6.txt *.htm *.html
    nhrt.exe -s:"text7" -r -f:7.txt *.htm *.html
    nhrt.exe -s:"text8" -r -f:8.txt *.htm *.html
    nhrt.exe -s:"text9" -r -f:9.txt *.htm *.html

    Как объединить команды в одну строку по списку действий? Пытался сделать по приведенному шаблону, но не получается…

    Ответить
    • 02.10.2018 в 12:10
      Постоянная ссылка

      Получилось!
      nhrt.exe -list:cod.txt -r *.htm *.html

      cod.txt:
      -s:"text1" -f:1.txt
      -s:"text2" -f:2.txt
      -s:"text3" -f:3.txt
      -s:"text4" -f:4.txt
      -s:"text5" -f:5.txt
      -s:"text6" -f:6.txt
      -s:"text7" -f:7.txt
      -s:"text8" -f:8.txt
      -s:"text9" -f:9.txt

      Ответить
  • 03.09.2018 в 18:13
    Постоянная ссылка

    Я так понимаю, что возможности прописывать функции нет? типа, в замене писать условия (разумеется, не русскими буквами), типа если а равно б, то нужно сделать такую замену/добавление

    Ответить
      • 04.09.2018 в 12:24
        Постоянная ссылка

        да, типа так — поиск ведется по двум строкам, в регулярке несколько групп, и если, к примеру, содержимое группы 2 совпадает с содержимым группы 6, то обработаться должно так-то и так-то

        Ответить
        • 05.09.2018 в 14:49
          Постоянная ссылка

          это можно сделать в скрипте JS/VBS – сделать и простое сравнение, и какое-то другое условие

          var g1 = line.replace(re,"$1");
          var g3 = line.replace(re,"$3");
          if ( g1 == g3 ) 
              …
          

          полный скрипт замены текста есть здесь

          Ответить
          • 05.09.2018 в 17:47
            Постоянная ссылка

            к сожалению, я не силен в делании скриптов, так что видимо у меня проблемы в задачах…
            буду ставить другие задачи…
            вопросов больше нет…

  • 28.08.2018 в 12:36
    Постоянная ссылка

    Есть ли возможность комментирования в списке команд в файле, который используется в параметре -list?

    Ответить
      • 27.09.2018 в 01:46
        Постоянная ссылка

        Было бы не плохо. Сейчас выкрутился из ситуации с помощью конструкции -spt:»Комментарий» -e. Комментарии уникальные, в тексте не встречается.

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

        Но есть еще предложение сделать поддержку многопоточной работы по отдельному ключу. Я заметил, что при большом количестве замен и обрабатываемых файлов, время замен сопоставимо с временем ввода/вывода. Это не оптимально, так как пока утилита заменяет что-то в одном файле можно было бы прочитать другой файл с диска и запустить замену в нем.
        Я попробовал на своем 4-ядерном процессоре запустить nhrt с помощью xargs с 4 и более потоками (запускается одновременно 4 и более nhrt с одним файлом на входе). Ускорение обработки в моих условиях было кратно вплоть до 6 потоков.

        И в конце есть ложка дегтя. Утилита медленно работает на очень длинных строках. Например, я запускал с параметрами -sre:\d+ -e и файлом со следующей длиной строки:
        500 000 — 6 сек
        1 000 000 — 23 сек
        2 000 000 — 87 сек
        4 000 000 — 366 сек
        Видно, что время растет непропорционально, скорее экспоненциально.
        Аналогично протестировал для замены простого текста -spt:1 -e
        500 000 — 2 сек
        1 000 000 — 7 сек
        2 000 000 — 35 сек
        4 000 000 — 135 сек
        То есть дело не в регулярных выражениях а в работе утилиты со строками.

        Для сравнения, Power Grep удаляет в той же строке из 4 000 000 символов \d+ за 2 сек.

        Ответить
        • 29.09.2018 в 11:00
          Постоянная ссылка

          Спасибо за подробное сообщение!

          Добавлю комментарии в следующей версии.

          По длинным строкам пока непонятно, почему с ними так получается — посмотрю.

          Ответить
        • 04.10.2018 в 14:10
          Постоянная ссылка

          Не получилось воспроизвести проблему с длинными строками.
          У меня -sre:\d+ -e на 1 МБ файле выполняется одинаково за < 0,5с и на файле со множеством коротких строк, и при переносе всего текста в одну строку. Может, связано с конкретным файлом и небольшим количеством замен (<600), тогда нужен реальный пример, чтобы проверить.

          Ответить
        • 07.10.2018 в 16:42
          Постоянная ссылка

          После некоторого анализа я пришел к выводу, что после каждой замены в строке идет или просмотр или копирование оставшейся строки.
          В таком случае на моих данных время, которое затрачивается в каждой следующей итерации, уменьшается, а общее время, за вычетом времени замены, пропорционально (x+1)*x/2, где x — количество замен. Если упростить, то пропорционально x^2. Это предположение хорошо соотносится с предыдущим замером времени.

          Ответить
      • 10.10.2018 в 13:19
        Постоянная ссылка

        Спасибо!
        Надеюсь, когда-нибудь будет реализована и многопоточная (параллельная) обработка файлов и исправлена ситуация с долгой обработкой длинных строк.

        Ответить
        • 16.10.2018 в 12:51
          Постоянная ссылка

          Улучшение при большом количестве замен будет в следующей версии. По параллельной обработке пока ничего сказать не могу.

          Ответить
  • 09.01.2016 в 20:23
    Постоянная ссылка

    Спасибо за труд, отличная программа! Жаль только , что нет «режима фильтра» (из STDIN в STDOUT без использования временных файлов — наподобие sed), а то бы вообще цены ей не было! :)

    Ответить

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *