Эта страница содержит ответы на часто задаваемые вопросы по программе 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: 36 комментариев

  • 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 аномальное поведение прекратилось.

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

        Ответить
          • 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 не ясны.
    в итоге у меня новое значение встает на место символа равно (старое значение остается)

    Ответить

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

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