Эта страница содержит ответы на часто задаваемые вопросы по программе nhreplace. Если вы не нашли ответ на свой вопрос, напишите его в комментариях внизу страницы (регистрация необходима для защиты от спама).

Какой синтаксис регулярных выражений используется в программе nhrt?

Программа nhrt использует синтаксис ECMAScript, описание можно найти в статье TR1 Regular Expressions.

Как выполнить замену символа табуляции пробелами?

Начиная с версии nhreplace v2.7, программа позволяет указывать непечатаемые символы по их коду, следующая команда заменяет каждый символ табуляции (задается параметром set=search escape text, т.к. использует управляющую последовательность вида \xHH) на 4 пробела (строка замены задается параметром t=text, т.к. не содержит управляющих символов):

nhrplc.exe -set:"\x09" -t:"    " *.cpp

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

Начиная с версии nhreplace v2.5, в программе присутствует возможность произвести поиск и замену текста для множества различных строк, при этом список операций поиска и замены задается в отдельном файле, то есть может иметь произвольный размер, например, и 100, и более шаблонов поиска с соответствующими строками для замены. Режим групповой замены текста задается с помощью аргумента -list, в котором также указывается имя файла со списком строк поиска/замены. Подробнее см. раздел справки Замена текста по списку.

Как выполнить замену текста в текущем каталоге и его подкаталогах одной командой?

Программа nhreplace до версии v2.3 не имеет режима обработки подкаталогов, этот режим будет добавлен в следующей версии, а пока можно реализовать обработку подкаталогов в командном файле с помощью команды FOR, подробнее см. Замена текста в подкаталогах (cmd).

Начиная с версии nhreplace v2.4, можно использовать параметр -r.

Как выполнить удаление (а не замену) найденного текста?

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

В версии v2.8.1 добавлен параметр -e (-erase) для удаления текста.

Как удалить лишние (дублирующиеся) переводы строк?

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

Как задать входной и выходной файлы?

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

Если требуется, чтобы в процессе работы сохранялись и исходный файл, и файл с преобразованиями (заменами и удалениями), то нужно добавить команду копирования исходного файла в файл для обработки nhrt, например:

copy source-file.txt file.txt
nhrt  ... file.txt

В этом примере в 1 строке исходный файл source-file.txt копируется в файл file.txt, а затем во 2 строке уже file.txt передается на обработку программе nhrt.

Одна мысль о “Вопросы и ответы по nhrt

  • 06.04.2023 в 09:35
    Постоянная ссылка

    Добрый день.
    Имеется файл конфигурации программы Miranda WORK.DAT, находится он в профиле пользователя ROAMING\MIRANDA\WORK
    В этом файле нужно заменить текст 100.100.100.100 на 200.200.200.200
    Подскажите, плз, строку параметров для выполнения этой операции.
    Нужно обработать примерно 300 компьютеров средствами KSC.

    Ответ
    • 09.04.2023 в 06:09
      Постоянная ссылка

      Добрый день, так можно написать:
      nhrt.exe -spt:"100.100.100.100" -t:"200.200.200.200" "%USERPROFILE%\ROAMING\MIRANDA\WORK\WORK.DAT"
      spt — поиск простого текста
      t — замена простым текстом

      Ответ
      • 10.04.2023 в 09:47
        Постоянная ссылка

        сложность в том, что в файле Work.dat используются символы которые не позволяют выполнить поиск :(
        Если его открыть в блокноте, скопировать весь текст, вставить в другой блокнот и сохранить файл — поиск/замена проходит, но приложение не работает. В исходном файле поиск не происходит.

        Ответ
  • 20.03.2023 в 09:56
    Постоянная ссылка

    А можно этой программой делать не поиск с заменой, а только поиск и как это делать ?

    Ответ
    • 20.03.2023 в 23:41
      Постоянная ссылка

      Специальной функции поиска в программе нет. Но если запустить с nocopy, то останутся только найденные фрагменты:
      nhrt -sre:regexp -fet:"$0\r\n" -nocopy file.txt
      Поэтому зависит от того, что именно вы хотите получить в выходном файле или выводе программы.

      Ответ
  • 25.01.2022 в 13:20
    Постоянная ссылка

    Приветствую

    столкнулся с проблемой длины. использую массивы в выражении для поиска, всего 1700+ символов, но выражение замены добавляет еще 400+ символов, и замена не работает.

    стал вычислять методом перебора, оказалось, если сократить строку замены, в котороую я забил просто буквы без пробелов, до того, чтобы вся команда поиска/замены составляло 2046 символов, то команда работает, но если больше, то не работает. стал гуглить, оказалось, вохможная проблема в лимите в js в 2048 символов. поскольку nhrt на ES, то в утилите установлен этот лимит? можете увеличить?

    Ответ
    • 25.01.2022 в 13:23
      Постоянная ссылка

      забыл написать, что предварительно все проверяю в сервисе https://regexr.com

      в нем все работает четко, находится/меняется, но nhrt ругается

      Ответ
  • 01.03.2021 в 19:59
    Постоянная ссылка

    Здравствуйте! Подскажите пожалуйста, можно ли использовать nhrt.exe подобным образом?

    Есть структурированный файл, где каждая строка представляет из себя:
    #E2!HeroName «Jakub» «George» «» «Y»
    #E2M3Mravenci2 «Au.» «Ouch» «» «Y»

    Мне нужно вставить текст в нужный блок, между «», но текст для замены взять из другого файла.
    Там он уже отсортирован по порядку, согласно оригиналу. и собственно, каждая замена это отдельная строка!

    Заранее спасибо!

    Ответ
  • 31.01.2021 в 13:41
    Постоянная ссылка

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

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

    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

    Спасибо.

    Ответ
  • 26.08.2019 в 08:28
    Постоянная ссылка

    Здравствуйте!
    Использую программу nhrt в скриптах Powershell. Возникла такая ситуация: если использовать в команде путь к папке с необходимыми файлами в текстовом виде, к примеру:
    Start-Process -FilePath 'nhrt.exe' -ArgumentList '-list:cleaning.txt I:\Union_plist\out\*.m3u' -NoNewWindow -Wait
    то nhrt.exe отлично «видит» путь и отрабатывает команду.
    Но часто необходимую папку выбираю скриптом GUI формы и тогда путь сохраняется в переменной. Но с переменной nhrt.exe путь не «видит» и файлы остаются без изменений.
    Пример такой команды:
    Start-Process -FilePath $soft -ArgumentList '-list:cleaning.txt $FolderPath\*.m3u' -NoNewWindow -Wait
    Подскажите, пожалуйста, можно ли как-то решить эту задачу или с переменной nhrt.exe не сможет взять путь к папке с файлами ?

    Ответ
    • 26.08.2019 в 14:35
      Постоянная ссылка

      Здравствуйте, спасибо за подробное описание и примеры, здесь в командную строку nhrt передаётся не значение переменной $FolderPath, а её имя, которое nhrt в принципе не может преобразовать в значение. Нужно модифицировать строку запуска, чтобы передавалось именно значение переменной.
      Я не спец в PowerShell, но насколько я понимаю, можно использовать подстановку, если поменять апострофы на кавычки:
      "-list:cleaning.txt $FolderPath\*.m3u"
      или просто склеивать строки (конкатенация) как-то так:
      '-list:cleaning.txt' + $FolderPath + '\*.m3u'

      Ответ
      • 26.08.2019 в 20:37
        Постоянная ссылка

        Спасибо большое за ответ и подсказку. Как-то я из виду упустил, что в одинарных кавычках переменная интерпретируется как текст.
        Поставил двойные, теперь nhrt отрабатывает команду как и должно быть.
        Замены выполняются.

        Ответ
  • 02.07.2019 в 18:34
    Постоянная ссылка

    Здравствуйте. Не очень разобрался, как правильно сделать замену. Имеется файл csv, где нужно удалить все точки с запятой, кроме разделителей, т.е. по факту те, что находятся в строке между символом кавычек. Я делал вот так -sre:"(")*(;)*(")" -ft:"$1 $3". Но почему-то он не правильно срабатывает. Что я делаю не так?

    Ответ
    • 03.07.2019 в 00:04
      Постоянная ссылка

      Здравствуйте,
      справка здесь TR1 Regular Expressions

      если хотите делать через группы, то
      -sre:"([^\x22]);([^\x22])" -ft:"$1$2"
      но, по-моему, проще через отрицательное совпадение
      -sre:"(?!\x22);(?!\x22)" -e.

      грубо говоря, удаляются все точки с запятой, непосредственно вокруг которых не стоят кавычки.
      \x22 — это кавычки. \" не везде работает.

      Ответ
  • 30.06.2019 в 07:54
    Постоянная ссылка

    Здравствуйте!

    а как предполагается задавать это программе?

    Можно, наверное, с параметром -r по маске файлов, если его связать с параметром -append.
    Проблему с удалением дублирующих строк пока решил скриптом powershell.
    В нём же и прописал запуск nhrt с параметрами. Но программа отработала почему-то только один запуск, в дальнейшем коде, где снова потребовалась замена в тексте, nhrt второй раз не сработала.

    Ответ
    • 05.07.2019 в 02:37
      Постоянная ссылка

      Можно, наверное, с параметром -r по маске файлов, если его связать с параметром -append.

      а чем это лучше, чем уже доступный функционал?

      в FORFILES:
      forfiles /m *.txt /s /c "nhrt -append -f:@path file.txt"
      или в DIR + FOR:
      for /f %%a in ('dir /b /s *.txt') do nhrt -append -f:%%a file.txt

      при этом обработка по маске добавляется в одну строчку, а ещё в FORFILES есть фильтр по датам /D, и в DIR есть различные варианты сортировки /O — по имени, расширению, времени, размеру.

      Ответ
  • 25.06.2019 в 11:04
    Постоянная ссылка

    Здравствуйте!
    nhutils, ещё раз огромное спасибо за программу!
    Для автоматического редактирования текстовых файлов, при некотором умении составления паттернов, вещь незаменимая.
    Хотел поинтересоваться: Вы планируете дальнейшую разработку nhrt ?
    Очень хорошо было бы добавить в программу функций «склеивания» нескольких текстовых файлов в один. И, что более важно, удаление дубликатов строк, но без их сортировки, дабы не нарушалась структура текста.
    С такими функциями программе вообще цены не было бы…

    Ответ
    • 26.06.2019 в 04:26
      Постоянная ссылка

      Здравствуйте, спасибо за положительный отзыв!
      Да, планирую развивать, но много времени сейчас не могу на это выделять.
      Для склеивания файлов можно использовать режимы, добавленные в версии 2.12insert и append.
      Например, эта команда добавляет содержимое file2.txt к содержимому file.txt, другими словами, подклеивает file2.txt к file.txt:
      nhrt -append -f:file2.txt,1251 -o:d file.txt
      Причем эти файлы даже могут быть в разных кодировках — программа сама приведёт к одной.
      Что касается удаление дубликатов строк, то на первый взгляд кажется, это из тех частных задач, которые обычно решаются скриптом. Хотя, может, я не понял, в чем именно задача.

      Ответ
  • 24.06.2019 в 16:15
    Постоянная ссылка

    Добрый день!
    Возник еще один вопрос. Потребовалось привести XML-файл к одной строке. Задача решается любым из двух вариантов:
    1) nhrt -sre:»\r\n *» -t:» » -o:d ndfl2pz.xml
    2) nhrt -sre:»\r\n *» -ft:» » -o:d ndfl2pz.xml
    но при размере файла 5Мб и примерно 200000 строк
    1-й вариант выполняется 4 мин, что явно неприемлемо, а второй практически мгновенно. Чем можно объяснить такое поведение?

    Ответ
    • 24.06.2019 в 16:59
      Постоянная ссылка

      Добрый день, разная реализация собственно замены. В первом варианте используется простой исторически сложившийся код, а во втором работает библиотека std::regex.

      Ответ
      • 26.06.2019 в 11:53
        Постоянная ссылка

        Вопрос не праздный, дело в том, что ко второму варианту я пришел после долгих 3-4 дней поисков и изучения регулярных выражений. Не у всех есть время на это. Мне кажется, следует избавиться от неэффективного «простого исторически сложившегося кода», его наличие увеличивает время вхождения в применение вашей программы и может отпугнуть потенциальных пользователей.
        Еще раз спасибо за вашу программу, прошу извинить, что осмелился на критику.

        Ответ
        • 26.06.2019 в 17:22
          Постоянная ссылка

          За обратную связь всегда спасибо!
          Ошибки и проблемы производительности в программе исправляются, это происходит постепенно, по мере их выявления и исходя из доступного времени. Это можно посмотреть по комментариями и по форуму программы.
          Так что и эта проблема будет со временем решена.

          Ответ
  • 14.06.2019 в 16:30
    Постоянная ссылка

    Добрый день!
    Есть ли ограничение на длину строк исходного файла?
    Часто попадаются XML-файлы в виде одной строки и nhrt выдает ошибку 2 при длине строки больше 102350.

    Ответ
    • 14.06.2019 в 16:54
      Постоянная ссылка

      Добрый день, сейчас есть ограничение 10 Мбайт на файл. На 100к нет ограничения.
      Ошибка 2 — это именно ошибка при обработке или код возврата 2 (образец не найден)?

      Ответ
      • 17.06.2019 в 16:07
        Постоянная ссылка

        Добрый день!
        Ответ на ваш вопрос- это код возврата: 2 ошибка в параметрах, не найден файл или другая ошибка

        Я не прекращал поиски решения и после явного указания кодировки исходного файла -cp:1251 аномальное поведение прекратилось.

        Ваша программа меня здорово выручила, успехов вам в ее развитии и продвижении

        Ответ
        • 18.06.2019 в 19:24
          Постоянная ссылка

          Добрый день, спасибо за информацию!
          (насчет кода я перепутал — образец не найден — это 1)

          Ответ
          • 21.06.2019 в 11:14
            Постоянная ссылка

            Добрый день!
            Возник еще один вопрос. Потребовалось привести XML-файл к одной строке. Задача решается любым из двух вариантов:
            1) nhrt -sre:»\r\n *» -t:» » -o:d ndfl2pz.xml
            2) nhrt -sre:»\r\n *» -ft:» » -o:d ndfl2pz.xml
            но при размере файла 5Мб и примерно 200000 строк
            1-й вариант выполняется 4 мин, что явно неприемлемо, а второй практически мгновенно. Чем можно объяснить такое поведение?

  • 01.06.2019 в 08:08
    Постоянная ссылка

    Здравствуйте!
    Не получается зарегистрироваться у Вас на форуме, письмо с активацией не приходит.
    Собственно вопрос в чём:
    Нужно оставить определённый кусок текста, удалив остальной.
    К примеру в тексте:
    Diva Universal (Россия)
    Familia Domashniy
    Fashion TV
    Fashion TV HD
    Fashion TV 3 HD
    Fashion TV 9 HD

    Fine Living
    Fine Living Europe
    Fine Living Network
    Food Network
    Food Network HD
    Нужно оставить только строки, выделенные жирным.
    Перебрал много регулярных выражений, никак не получается.
    Подскажите, пожалуйста, возможно ли это с программой nhrt ?
    Какое регулярное выражение нужно применить ?
    -sre:".*(Fashion TV.*Fashion TV 9 HD).*" -ft:"$1"
    не срабатывает.

    Ответ
    • 01.06.2019 в 22:45
      Постоянная ссылка

      Здравствуйте, для этого можно воспользоваться такой возможностью регулярных выражений, как Negative Assert, в используемой библиотеке std::regex она поддерживается (TR1 Regular Expressions).
      Выглядит так:
      nhrt -sre:"^(?!Fashion TV).*[\r\n]*" -e file.txt

      Ответ
      • 03.06.2019 в 07:20
        Постоянная ссылка

        nhutils, ещё небольшой вопрос-уточнение. Подскажите, пожалуйста, какой максимальной длины может быть регулярное выражение для использования в nhrt ?
        Если мне необходимо оставить в тексте n-е количество строк, сколько можно будет их вписать в приведённое выше рег. выражение ?
        Для точности, я его изменил, так как необходимо захватывать и следующую строку (это ссылка). Получилось так:
        -sre:"^(?!Fashion TV)[^\n\r]+\r?\nhttps?:\/\/[^\n\r]+\r?\n?" -e
        но бывает не все строки подпадают под шаблон Fashion TV, тогда нужно добавлять нужные строки в регулярку, к примеру так:
        -sre:"^(?!Fashion TV)(?!Club TV)(?!Kino TV)[^\n\r]+\r?\nhttps?:\/\/[^\n\r]+\r?\n?" -e

        Ответ
        • 04.06.2019 в 01:35
          Постоянная ссылка

          Регулярные выражения в программе реализуются библиотекой std::regex, и в описании на нее я такого рода ограничений не видел. Поэтому точно сказать нельзя, насколько большое или сложное может быть выражение. Но эти примеры, я думаю, далеки от предела возможностей библиотеки.

          Ответ
  • 22.10.2016 в 13:53
    Постоянная ссылка

    Здравствуйте,
    Не могу разобраться в синтаксисе, умеет-ли программа искать и менять строки целиком?

    Пример:
    Нужно найти:

    20
    18
    1

    Заменить на:

    9
    20
    18

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

      Здравствуйте, в части регулярных выражений программа реализует все возможности стандартной библиотеки, в том числе якоря ^ и $ для отметки начала и конца строки. Надо сказать, что якорь конца строки $ имеет такую особенность, что соответствует концу строки \n, но не \r\n, см. End of String or Line: $.
      В итоге, заменить всю строку можно так:

      nhrplc -sre:"^28\r?$" -et:"06\r" -o:d test_file.txt
      Ответ
      • 26.10.2016 в 12:19
        Постоянная ссылка

        Не могу разобраться.
        Мне нужно найти и заменить последовательность из трех строк (не каждую строку по отдельности)
        Не подскажите примером?

        Так не отрабатывает… Просто я логики синтоксиса вообще не понимаю.
        nhrplc -sre:»^20\r?$^18\r?$^1\r?$» -et:»^9\r?$^20\r?$^18\r?$» -o:d test.txt

        Ответ
        • 26.10.2016 в 19:58
          Постоянная ссылка

          Если надо заменить сразу три строки, то так:

          nhrplc -set:"20\r\n18\r\n1\r\n" -et:"9\r\n20\r\n18\r\n" -o:d test.txt

          Отличие от замены внутри одной строки такое, что указываются символы перевода строки \r\n для каждой строки.

          Ответ
  • 07.10.2016 в 14:45
    Постоянная ссылка

    Добрый день. Никак не разберусь с синтаксисом и «форматированным» текстом (-ft:)
    простой пример — есть текст «crm user name=ivan» значение после равно переменное,
    его то и хочу поменять. делаю так
    nhrplc -sre:»(user\sname)(\W)» -i -ft:»$1user name=%username%$5″ file.txt
    а получаю userpetrivan
    — совсем ничего не понимаю) У Вас вообще нигде это не описано (
    \= в искомом не понятно как правильно вписать — перестает срабатывать, и $1 $5 не ясны.
    в итоге у меня новое значение встает на место символа равно (старое значение остается)

    Ответ

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

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