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

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

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

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

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

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

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

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

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

nhrt.exe -spt:plaintext|-set:escapetext [-i] [-occ:occurences] [-r] -t:plaintext|-et:escapetext|-f:filename[,codepage] [-cp:odepage[,codepage]] [-o:(q|s|d*)] [-notitle] filemask...

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

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

Файлы для обработки задаются без параметра, может быть один или несколько файлов, можно использовать маски (символы подстановки ? и *).

Обработка файлов происходит «на месте», то есть изменения вносятся в указанный файл. Другими словами, указанные файлы являются и входными, и выходными.

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

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

При запуске со следующими параметрами программа выполняет поиск текста по регулярному выражению (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:actionsfile[,codepage] [-r] [-cp:codepage[,codepage]] [-o:(q|s|d*)] [-notitle] filemask…

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

-spt:plaintext|-set:escapetext [-i] -t:plaintext|-et:escapetext|-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:простойтекст|-set:форматированныйтекст [-i] -t:простойтекст|-et:форматированныйтекст|-f:имяфайла[,кодоваястраница] [-notitle]

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

nhrt.exe -sre:регулярное_выражение [-i] -t:простой_текст|-et:esc_текст|-ft:форматированный_текст|-f:имя_файла[,кодовая_страница] [-notitle]

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

nhrt.exe -list:имя_файла_списка_замен[,кодовая_страница] [-notitle]

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

файлы для обработки

Файлы для обработки задаются без параметра, может быть один или несколько файлов, можно использовать маски (символы подстановки ? и *), например:

nhrt ... file*.txt data1?.txt

Обработка файлов происходит «на месте», то есть изменения вносятся в указанный файл. Другими словами, указанные файлы являются и входными, и выходными.

возможные сочетания параметров поиска и замены текста

Поиск \ ЗаменаПростой текст (-t)ESC-текст (–et)Содер-жимое файла (-f)Форма-тирован-ный текст (-ft)Форма-тирован-ный ESC-текст (-fet)
Простой текст (–spt)
ESC-текст (-set)
Текст из файла (-spf)
Регулярное выражение (-sre)
Регулярное выражение из файла (-srf)

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

-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 и т.д.

Начиная с v2.12, в списке можно делать комментарии.

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

-append

Задает добавление текста в конец файла. Параметр добавлен в версии v2.12.

Добавляемый текст задаётся одним из параметров -t, -et или -f.

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

-i, -ignorecase

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

-insert

Параметр -insert используется совместно с параметрами -t, -et или -f и задает вставку текста в начало файла.

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

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

Пример:

nhrt -insert -t:"текст" имя_файла.txt

-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 Подробные сведения: каждый файл и число замен

-nc, -nocopy

Задает удаление текста, не отвечающего регулярному выражению.

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

Используется совместно с –sre и задает вывод только текста, отвечающего регулярному выражению:

-sre:<regex> -nocopy

Остальной текст удаляется.

Nocopy можно использовать и в командной строке, и в списке –list.

-r, -recursive

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

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

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

-rc, -returncode

Параметр добавлен в версии v2.14 и задаёт, какие значения будет возвращать программа.

  • -returncode:count (краткая форма -rc:c) – программа возвращает число сделанных изменений (замен текста, преобразований кодировки)
  • -returncode:errorlevel (краткая форма -rc:el) – программа возвращает код ошибки (errorlevel): 0 — сделаны замены, 1- текст не найден, 2 — ошибка.

По умолчанию программа возвращает код ошибки (errorlevel).

-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 — Ошибка в параметрах, не найден файл или другая ошибка.

Начиная с версии v2.14, программа может возвращать число сделанных изменений, см. параметр -returncode.

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

Параметр <кодовая страница> может иметь следующие значения: 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: 56 комментариев

  • 07.02.2022 в 17:14
    Постоянная ссылка

    Приветствую

    NHRT какую версию ECMA поддерживает?

    я как понимаю, минимум до ECMA 2018, ибо не поддерживает именованные группы

    на какую версию надо ориентироваться?

    Ответить
  • 30.07.2021 в 08:52
    Постоянная ссылка

    Здравствуйте! Есть текстовый файл с n строк. В конце каждой строки мне нужно поставить три запятые ,,,
    Подскажите, пожалуйста, как это можно сделать.
    Примерно такая строка, наверное —
    nhrt -cp:1251 -sre:»?????????» -t:»,,,» 1.txt
    Что должно быть вместо знаков вопроса? И нужен ли тут -t:»,,,» символ возврата каретки?

    Ответить
    • 30.07.2021 в 09:30
      Постоянная ссылка

      В принципе решил через
      Setlocal EnableExtensions
      set filein=1.csv
      set fileout=2.txt
      for /f «usebackq skip=1 delims= eol=» %%a in («%filein%») do Echo %%a,,,>>»%fileout%»
      Долго, но эффективно. Если есть решение через программу, то буду рад.

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

    Здравствуйте!
    Есть две строки в файле
    «dataVersionName» : «0102»,
    «dataRomVersionCode» : «0102»,
    где 0102 — дата, определяемая по
    set curver=%dd%%mm% и подставляемая в виде %curver%.
    Эти две строки расположены в середине текстового файла, требуется замена только даты.
    Помогите, пожалуйста, реализовать замену даты на актуальную с помощью nhrt.exe. Есть ли возможность не учитывать некоторые символы в искомом тексте? Или как еще можно заменить?

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

    Всем здравствуйте

    Пожалуйста, будьте так любезны, помогите

    Есть строки типа

    p:TricolorTV,c:001541,c:031541,c:050001,c:100003,c:111542,c:141542,C:2710,C:4ae1,f:40

    Текст ,c:001541,c:031541,c:050001,c:100003,c:111542,c:141542,C:2710,C:4ae1 может быть любым, произвольным

    Пожалуйста, помогите удалить текст между
    p:TricolorTV,
    и
    f:40
    то есть это
    c:001541,c:031541,c:050001,c:100003,c:111542,c:141542,C:2710,C:4ae1,

    Чтобы на выходе была строка
    p:TricolorTV,f:40

    Спасибо.

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

    Привет.

    как с помощью nhrt превратить строки типа

    «content»: «11 — 17»,

    в

    «content»: «11»,
    «content»: «12»,
    «content»: «13»,
    «content»: «14»,
    «content»: «15»,
    «content»: «16»,
    «content»: «17»,

    просто такое надо сделать в более тысячи файлах.

    Тулза отличная, пользуюсь давно и много. Но вот непонятно, можно ли в ней использовать функции…

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

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

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

    Привет

    Столкнулся с нуждой, чтобы регистр не учитывался. Я и не думал, что nhrt по умолчанию чувствителен к регистру. Зачем?

    Сутки ушло на разгадку, почему мои команды не работают!!! Оказалось, что регистр учитывается.

    Ладн, надо же отключить регистр. Но как? В батнике пишу как я привык команду для замены из файла, и куда бы я не ставил -i или -ignorecase в батнике, регистр учитывается. Пришлось в сто четырнадцать тысяч строк добавлять -i.

    А почему такое нельзя раз написать в батнике для всей обозначенной работы?

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

      Добрый день,
      Во большинстве программ по умолчанию идет поиск и сравнение с учетом регистра — find, findstr, тот же grep. И в библиотеках так же — std, regex. Так и в nhrt.
      Насчёт прописывания параметров по умолчанию, можно попробовать, посмотрю, что можно сделать.

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

    Добрый вечер.
    Команда -append через -list «отказывается» выполняться.
    nhrt -list:list rep.txt
    а в list.txt строка
    - append -t:"TEST"

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

    Благодарю за программу и Ваш труд.

    Можно уточнить, если использовать для поиска и замены фраз список -list,
    то при получении результата успешных замен он выводится на экран.
    nhrt v2.13.0.15 * Замена текста в файлах * http://nhutils.ru/nhrt/
    text.txt UTF-8 : 5
    Мне важно знать (получить для дальнейшей обработки) число успешных замен, в данном случае 5. Возможно ли как-то это получить? «Типа» кода ошибки 0 1 2. Допустим в файле списке указано 6 строк замен и таких файлов несколько и у каждого своё число строк поиска-замен. Либо на выходе после запуска программы и обработки по списку мне важно узнать все строки были успешно заменены или нет.

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

    Не работает удаление пробела в начала или конце строки следующими простыми командами:
    -sre:" $" -e
    -sre:"^ " -e

    Я понимаю, что это особенность регулярных выражений ECMAScript, и символы «^» и «$» означают начало и конец ввода, а не строки. Это можно переопределить с помощью флага m. Но в nhrt этот флаг установить нельзя.

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

      Почему-то еще не работает регулировка жадности квантификатора:
      Выражение
      -sre:"^.*?" -e
      для строки
      текст1текст2
      удаляет всю строку, а не часть текст1

      Ответить
      • 29.05.2020 в 08:25
        Постоянная ссылка

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

        For all grammars except BRE and grep, a repetition count can also take one of the following forms:

        «?». Equivalent to «{0,1}».

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

      В библиотеке std::regex MSVC2010, в которой собрана программа, нет поддержки режима m (Multiline).
      Можно делать замену с positive assert (?=)
      -sre:"^ " -e
      -sre:"(?=\n) " -e
      -sre:" $" -e
      -sre:" (?=\r\n)" -e

      Ответить
      • 04.06.2020 в 15:04
        Постоянная ссылка

        Спасибо за напоминание такого способа.
        Для справки, все дальнейшие команды я выполнял из списка замен с помощью команды -list и обрабатывал файлы.

        По поводу пробелов в конце строки вот такая команда:
        -sre:" (?=\r|\n|$)" -e
        удалит пробел в конце файла, а
        -sre:" (?=\r|\n|$)" -e
        удалит пробел не только в конце файла, но еще и в конце всех строк, независимо от типа разрыва строки (\r\n — windows, \n — unix или \r — macintosh).
        Это касается не только пробелов, но и любых других символов или последовательностей.
        Не могу сказать, что это очень удобно, но работает.

        Удаление пробелов (или любых других символов или последовательностей) в начале строки оказалось не настолько простым:
        -sre:"(?=\r|\n) " -e
        не работает, так как упреждение работает ПОСЛЕ какой-либо строки. В данном случае упреждение ДО пробела.
        Следующая команда работает, но с особенностями:
        -sre:"^ " -e
        Если разрыв строки осуществлен с помощью воврата каретки и перевода строки (\r\n — windows) или только перевода строки (\n — unix), то удаляются ВСЕ пробелы в начале файла и ВСЕ пробелы в начале каждой строки.
        Если разрыв строки осуществлен с помощью воврата каретки (\r — macintosh), то удаляются ВСЕ пробелы только в начале файла.
        Тут две проблемы:
        1. Удаляются все символы (или последовательности), а не один. Поэтому ранее я ошибочно посчитал, что не работает должным образом управление жадностью.
        Приходится управлять этим с помощью -occ:1
        2. Если тип разрыва строки осуществлен только возвратом каретки (\r — macintosh), то необходимо сначал заменить все \r на \r\n, тогда будут произведены замены на всех строках, а не только в начале файла.

        Ответить
        • 04.06.2020 в 15:09
          Постоянная ссылка

          Небольшая ошибка в первой команде для удаления пробела в конце файла.
          Вместо
          -sre:" (?=\r|\n|$)" -e
          должно быть
          -sre:" $" -e

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

    Подскажите, пытаюсь сделать пакетную обработку файлов.
    Но мне нужно перекодировать только ansi в utf8
    Как сделать чтобы файлы других кодировок не трогало?

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

      Такой фильтрации файлов по кодировке в программе не предусмотрено. Предполагается, что вся фильтрация делается указанием маски на имя файла.

      Ответить
  • 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. Это предположение хорошо соотносится с предыдущим замером времени.

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

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

    Ответить

Добавить комментарий для Дмитрий Отменить ответ

Ваш адрес email не будет опубликован.