Эта страница содержит ответы на часто задаваемые вопросы по программе 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.
Добрый день.
Имеется файл конфигурации программы Miranda WORK.DAT, находится он в профиле пользователя ROAMING\MIRANDA\WORK
В этом файле нужно заменить текст 100.100.100.100 на 200.200.200.200
Подскажите, плз, строку параметров для выполнения этой операции.
Нужно обработать примерно 300 компьютеров средствами KSC.
Добрый день, так можно написать:
nhrt.exe -spt:"100.100.100.100" -t:"200.200.200.200" "%USERPROFILE%\ROAMING\MIRANDA\WORK\WORK.DAT"
spt — поиск простого текста
t — замена простым текстом
сложность в том, что в файле Work.dat используются символы которые не позволяют выполнить поиск :(
Если его открыть в блокноте, скопировать весь текст, вставить в другой блокнот и сохранить файл — поиск/замена проходит, но приложение не работает. В исходном файле поиск не происходит.
Там, вероятно, не текстовый формат, а какая-нибудь база данных?
да. Вам можно выслать файлик на «посмотреть»?
Особо смысла нет, если он не текстовый.
Такие файлы только hex редактором править.
А можно этой программой делать не поиск с заменой, а только поиск и как это делать ?
Специальной функции поиска в программе нет. Но если запустить с nocopy, то останутся только найденные фрагменты:
nhrt -sre:regexp -fet:"$0\r\n" -nocopy file.txt
Поэтому зависит от того, что именно вы хотите получить в выходном файле или выводе программы.
Приветствую
столкнулся с проблемой длины. использую массивы в выражении для поиска, всего 1700+ символов, но выражение замены добавляет еще 400+ символов, и замена не работает.
стал вычислять методом перебора, оказалось, если сократить строку замены, в котороую я забил просто буквы без пробелов, до того, чтобы вся команда поиска/замены составляло 2046 символов, то команда работает, но если больше, то не работает. стал гуглить, оказалось, вохможная проблема в лимите в js в 2048 символов. поскольку nhrt на ES, то в утилите установлен этот лимит? можете увеличить?
забыл написать, что предварительно все проверяю в сервисе https://regexr.com
в нем все работает четко, находится/меняется, но nhrt ругается
Добрый день, какая замена? регулярное выражение? можете дать пример конфигурации?
Здравствуйте! Подскажите пожалуйста, можно ли использовать nhrt.exe подобным образом?
Есть структурированный файл, где каждая строка представляет из себя:
#E2!HeroName «Jakub» «George» «» «Y»
#E2M3Mravenci2 «Au.» «Ouch» «» «Y»
Мне нужно вставить текст в нужный блок, между «», но текст для замены взять из другого файла.
Там он уже отсортирован по порядку, согласно оригиналу. и собственно, каждая замена это отдельная строка!
Заранее спасибо!
Здравствуйте, такой возможности нет.
Всем здравствуйте
Есть строки типа
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
Спасибо.
Добрый день,
Используйте positive assert, что-то типа
(?= p:TricolorTV,)(.*)(?= f:40)
Здравствуйте!
Использую программу 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 не сможет взять путь к папке с файлами ?
Здравствуйте, спасибо за подробное описание и примеры, здесь в командную строку nhrt передаётся не значение переменной $FolderPath, а её имя, которое nhrt в принципе не может преобразовать в значение. Нужно модифицировать строку запуска, чтобы передавалось именно значение переменной.
Я не спец в PowerShell, но насколько я понимаю, можно использовать подстановку, если поменять апострофы на кавычки:
"-list:cleaning.txt $FolderPath\*.m3u"
или просто склеивать строки (конкатенация) как-то так:
'-list:cleaning.txt' + $FolderPath + '\*.m3u'
Спасибо большое за ответ и подсказку. Как-то я из виду упустил, что в одинарных кавычках переменная интерпретируется как текст.
Поставил двойные, теперь nhrt отрабатывает команду как и должно быть.
Замены выполняются.
Здравствуйте. Не очень разобрался, как правильно сделать замену. Имеется файл csv, где нужно удалить все точки с запятой, кроме разделителей, т.е. по факту те, что находятся в строке между символом кавычек. Я делал вот так
-sre:"(")*(;)*(")" -ft:"$1 $3"
. Но почему-то он не правильно срабатывает. Что я делаю не так?Здравствуйте,
справка здесь TR1 Regular Expressions
если хотите делать через группы, то
-sre:"([^\x22]);([^\x22])" -ft:"$1$2"
но, по-моему, проще через отрицательное совпадение
-sre:"(?!\x22);(?!\x22)" -e
.грубо говоря, удаляются все точки с запятой, непосредственно вокруг которых не стоят кавычки.
\x22
— это кавычки.\"
не везде работает.Здравствуйте!
Можно, наверное, с параметром -r по маске файлов, если его связать с параметром -append.
Проблему с удалением дублирующих строк пока решил скриптом powershell.
В нём же и прописал запуск nhrt с параметрами. Но программа отработала почему-то только один запуск, в дальнейшем коде, где снова потребовалась замена в тексте, nhrt второй раз не сработала.
а чем это лучше, чем уже доступный функционал?
в 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 — по имени, расширению, времени, размеру.
Здравствуйте!
nhutils, ещё раз огромное спасибо за программу!
Для автоматического редактирования текстовых файлов, при некотором умении составления паттернов, вещь незаменимая.
Хотел поинтересоваться: Вы планируете дальнейшую разработку nhrt ?
Очень хорошо было бы добавить в программу функций «склеивания» нескольких текстовых файлов в один. И, что более важно, удаление дубликатов строк, но без их сортировки, дабы не нарушалась структура текста.
С такими функциями программе вообще цены не было бы…
Здравствуйте, спасибо за положительный отзыв!
Да, планирую развивать, но много времени сейчас не могу на это выделять.
Для склеивания файлов можно использовать режимы, добавленные в версии 2.12 — insert и append.
Например, эта команда добавляет содержимое file2.txt к содержимому file.txt, другими словами, подклеивает file2.txt к file.txt:
nhrt -append -f:file2.txt,1251 -o:d file.txt
Причем эти файлы даже могут быть в разных кодировках — программа сама приведёт к одной.
Что касается удаление дубликатов строк, то на первый взгляд кажется, это из тех частных задач, которые обычно решаются скриптом. Хотя, может, я не понял, в чем именно задача.
Для склеивания файлов можно использовать режимы, добавленные в версии 2.12 — insert и append
Да, я знаю, функции отличные. Но бывает нужно «склеить», заведомо неизвестное, количество файлов, неизвестны и их имена.
Что касается удаление дубликатов строк, то на первый взгляд кажется, это из тех частных задач, которые обычно решаются скриптом.
Да, скриптом эту задачу можно решить. Но хотелось бы, так сказать, «всё вместе», чтобы меньше кода было…
Да и, практически все скрипты, как и утилиты для удаления дубликатов строк, сортируют строки и в выходном файле получается мешанина.
Ещё раз спасибо за программу. И успехов в новых идеях и их реализации.
по удалению дубликатов хорошо бы уточнить задачу. возможно, подойдёт новый параметр -occ/-occurences, если написать что-то вроде:
-occ:2-9999 -e
К сожалению параметр -occ не подойдёт для такой задачи.
Делаю файлы плейлистов по нескольким ссылкам. В итоге в выходном файле могут быть дубли, изначально присутствовавшие в нескольких входных.
К примеру:
#EXTINF:0, Перший
http://193.106.211.2:1234/udp/225.1.1.101:4001
#EXTINF:0, Інтер
http://193.106.211.2:1234/udp/225.1.1.102:4001
#EXTINF:0, 1+1
http://193.106.211.2:1234/udp/225.1.1.103:4001
#EXTINF:0, ICTV
http://193.106.211.2:1234/udp/225.1.1.104:4001
#EXTINF:0, 5 канал
http://193.106.211.2:1234/udp/225.1.1.105:4001
#EXTINF:0, СТБ
http://193.106.211.2:1234/udp/225.1.1.106:4001
#EXTINF:0, ТРК «Украина»
http://193.106.211.2:1234/udp/225.1.1.107:4001
#EXTINF:0, Сити
http://193.106.211.2:1234/udp/225.1.1.108:4001
#EXTINF:0, НТН
http://193.106.211.2:1234/udp/225.1.1.109:4001
#EXTINF:0, ТЕТ
http://193.106.211.2:1234/udp/225.1.1.110:4001
#EXTINF:0, ТРК «Киев»
http://193.106.211.2:1234/udp/225.1.1.114:4001
#EXTINF:0, Тонис
http://193.106.211.2:1234/udp/225.1.1.111:4001
#EXTINF:0, Мега
http://193.106.211.2:1234/udp/225.1.1.112:4001
#EXTINF:0, М1
http://193.106.211.2:1234/udp/225.1.1.113:4001
#EXTINF:0, ТРК «Киев»
http://193.106.211.2:1234/udp/225.1.1.114:4001
#EXTINF:0, 2+2
http://193.106.211.2:1234/udp/225.1.1.115:4001
#EXTINF:0, ТРК «Украина»
http://193.106.211.2:1234/udp/225.1.1.107:4001
В данном примере два дубля одинаковых названий каналов и ссылок на их потоки.
Любые повторения пар (1-я строка — название канала, 2-я ссылка) нужно удалить, оставив только одну пару.
Можно было бы применить батник:
@echo off
@"MEGA-PLAYLIST_out.m3u" (for /f "delims=" %%i in ('more') do @if not defined %%i (echo %%i& set %%i=*))
fc /C MEGA-PLAYLIST.m3u MEGA-PLAYLIST_out.m3u > MEGA-PLAYLIST_out-2.m3u
exit/b
Но с большим количеством строк он делает мешанину, так же как и многие другие подобные скрипты.
А в выходном файле нужно сохранить изначальную структуру, пара — «Название канала, вторая строка — ссылка на его поток».
То есть удаление дубликатов строк должно происходить без сортировки строк, ну или с сортировкой попарно (канал, ссылка).
а как предполагается задавать это программе?
Добрый день!
Возник еще один вопрос. Потребовалось привести 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 мин, что явно неприемлемо, а второй практически мгновенно. Чем можно объяснить такое поведение?
Добрый день, разная реализация собственно замены. В первом варианте используется простой исторически сложившийся код, а во втором работает библиотека std::regex.
Вопрос не праздный, дело в том, что ко второму варианту я пришел после долгих 3-4 дней поисков и изучения регулярных выражений. Не у всех есть время на это. Мне кажется, следует избавиться от неэффективного «простого исторически сложившегося кода», его наличие увеличивает время вхождения в применение вашей программы и может отпугнуть потенциальных пользователей.
Еще раз спасибо за вашу программу, прошу извинить, что осмелился на критику.
За обратную связь всегда спасибо!
Ошибки и проблемы производительности в программе исправляются, это происходит постепенно, по мере их выявления и исходя из доступного времени. Это можно посмотреть по комментариями и по форуму программы.
Так что и эта проблема будет со временем решена.
Добрый день!
Есть ли ограничение на длину строк исходного файла?
Часто попадаются XML-файлы в виде одной строки и nhrt выдает ошибку 2 при длине строки больше 102350.
Добрый день, сейчас есть ограничение 10 Мбайт на файл. На 100к нет ограничения.
Ошибка 2 — это именно ошибка при обработке или код возврата 2 (образец не найден)?
Добрый день!
Ответ на ваш вопрос- это код возврата: 2 ошибка в параметрах, не найден файл или другая ошибка
Я не прекращал поиски решения и после явного указания кодировки исходного файла -cp:1251 аномальное поведение прекратилось.
Ваша программа меня здорово выручила, успехов вам в ее развитии и продвижении
Добрый день, спасибо за информацию!
(насчет кода я перепутал — образец не найден — это 1)
Добрый день!
Возник еще один вопрос. Потребовалось привести 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 мин, что явно неприемлемо, а второй практически мгновенно. Чем можно объяснить такое поведение?
Здравствуйте!
Не получается зарегистрироваться у Вас на форуме, письмо с активацией не приходит.
Собственно вопрос в чём:
Нужно оставить определённый кусок текста, удалив остальной.
К примеру в тексте:
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"
не срабатывает.
Здравствуйте, для этого можно воспользоваться такой возможностью регулярных выражений, как Negative Assert, в используемой библиотеке std::regex она поддерживается (TR1 Regular Expressions).
Выглядит так:
nhrt -sre:"^(?!Fashion TV).*[\r\n]*" -e file.txt
nhutils, спасибо большое ! Всё получилось как нужно.
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
Регулярные выражения в программе реализуются библиотекой std::regex, и в описании на нее я такого рода ограничений не видел. Поэтому точно сказать нельзя, насколько большое или сложное может быть выражение. Но эти примеры, я думаю, далеки от предела возможностей библиотеки.
Здравствуйте,
Не могу разобраться в синтаксисе, умеет-ли программа искать и менять строки целиком?
Пример:
Нужно найти:
20
18
1
Заменить на:
9
20
18
Здравствуйте, в части регулярных выражений программа реализует все возможности стандартной библиотеки, в том числе якоря ^ и $ для отметки начала и конца строки. Надо сказать, что якорь конца строки $ имеет такую особенность, что соответствует концу строки \n, но не \r\n, см. End of String or Line: $.
В итоге, заменить всю строку можно так:
Не могу разобраться.
Мне нужно найти и заменить последовательность из трех строк (не каждую строку по отдельности)
Не подскажите примером?
Так не отрабатывает… Просто я логики синтоксиса вообще не понимаю.
nhrplc -sre:»^20\r?$^18\r?$^1\r?$» -et:»^9\r?$^20\r?$^18\r?$» -o:d test.txt
Если надо заменить сразу три строки, то так:
Отличие от замены внутри одной строки такое, что указываются символы перевода строки
\r\n
для каждой строки.Добрый день. Никак не разберусь с синтаксисом и «форматированным» текстом (-ft:)
простой пример — есть текст «crm user name=ivan» значение после равно переменное,
его то и хочу поменять. делаю так
nhrplc -sre:»(user\sname)(\W)» -i -ft:»$1user name=%username%$5″ file.txt
а получаю userpetrivan
— совсем ничего не понимаю) У Вас вообще нигде это не описано (
\= в искомом не понятно как правильно вписать — перестает срабатывать, и $1 $5 не ясны.
в итоге у меня новое значение встает на место символа равно (старое значение остается)
Добрый день! Вы хотите заменить ivan на %username%? Тогда так:
nhrplc -sre:"(user name=)(\w+)" -i -ft:"$1 %username%" file.txt
$1, … – это capture groups, описание здесь: Format flags, пример можно посмотреть на форуме Замена с использованием регулярных выражений.
Здесь только две группы, $1 и $2. Единственное, если убрать пробел между $1 и %username%, то заменяет пустым текстом, возможно, это ошибка – проверим позднее.
Спасибо, срабатывает, правда после = пробел вставляет.
Сделано описание примера – Замена текста с использованием результатов поиска по регулярному выражению.
Насчёт пробела – это ошибка в v2.8.0, исправлено в nhreplace v2.8.1, в ней корректно работает команда, не добавляющая лишний пробел:
nhrplc -sre:"(user name=)(\w+)" -i -ft:"$1%username%" file.txt
добавлен ещё один пример замены текста по регулярному выражению – Изменение формата дат, используются также параметры -sre и -ft.