Бесплатная программа nhrt (nhutils replace text, ранее называлась nhreplace) заменяет текст в файлах или в потоке stdin.
Возможности
Программа nhrt ищет заданный образец текста в файле, в качестве фрагмента может быть задан обычный текст (plain text), форматированный текст (с использованием символов форматирования, таких как перевод строки) или регулярного выражения. Текст для поиска задаётся в параметре командной строки или в текстовом файле.
Программа заменяет найденные фрагменты на заданный заменяющий текст, это может быть обычный текст, форматированный текст или группы регулярного выражения. Заменяющий текст задаётся строкой или содержимым текстового файла
Программа может обрабатывать множество файлов, по маске и в подкаталогах.
В дополнение к режиму замены, программа может вставлять текст перед найденным фрагментов или после него.
Пакетное выполнение нескольких команд поиска/замены за один проход.
Программа работает из командной строки Windows и может быть использована в пакетных файлах.
Кодировки текстовых файлов
Программа nhrt используется также для пакетной перекодировки текстовых файлов между различными кодировками, поддерживаются кодировки текстовых файлов:
- ANSI (Windows-1251 для русской версии Windows),
- OEM (CodePage 866 для русской версии Windows),
- Unicode (UTF-16),
- UTF-8,
- кодировки, заданные номером, например, 1252 — западно-европейские языки (французский и др).
Преобразование кодировки может выполняться одновременно с заменой текста, например: считать файл в кодировке utf-8, выполнить замену текста, затем сохранить в кодировке Unicode. Также при замене текста на содержимое файла программа позволяет обрабатывать файлы в разных кодировках, например, одним действием вставить текст из файла с OEM кодировкой в файл с кодировкой Unicode.
Командные файлы и скрипты
Программа ориентирована на пакетное применение в командных CMD файлах, скриптах JScript/VBScript и других автоматических решениях:
- программа не требует интерактивного ввода информации от пользователя
- все режимы задаются через параметры командной строки
- возможность обработки файлов по маске файлов с использованием символов подстановки ? и *
- возможность обработки подкаталогов (recurse subdirectories)
Для программы оказывается техническая поддержка в виде открытого форума
Работа программы проверена в Windows XP, Windows Vista 32/64, Windows 7 32/64. Программа не требуется установки.
С версии nhrt v2.2 добавлена возможность преобразования кодировки между OEM и ANSI «на лету» преобразованием входного потока stdin, чтобы обеспечить совместную работу командных файлов (кодировка OEM/866) с программами, работающими в кодировке ANSI. Возможность реализована в виде отдельного исполняемого файла nhconv.exe (входит в загрузку nhreplace), например, следующая команда преобразует вывод dir в кодировку ANSI:
cmd /c dir | nhconv
Узнать больше о программе nhrt
Примеры использования nhrt
Примеры применения программы nhrt: замена статическим текстом, замена файлом, командный файл для сборки html файлов из фрагментов.
Поиск регулярного выражения и замена статическим текстом
Замена дат 2000-2019 гг. на 01.03.2009 в *.txt и *.cmd файлах текущего каталога:
nhrt -sre:"[0-3]?[0-9]\.[0-1]?[0-9].20[0-1][0-9]" -t:"01.03.2009" *.txt *.cmd
Первый параметр задает регулярное выражение для поиска. Предполагается дата в формате d.M.yyyy.
Второй параметр задает статическую заменяющую строку.
Третий и четвертый параметры задают маски обрабатываемых файлов.
Поиск строки и замена содержимым файла
Замена строки ref1 на содержимое файла content1.txt во всех html файлах текущего каталога:
nhrt -s:"ref1" -f:content1.txt *.htm *.html
Первый параметр задает фиксированный текст ref1, подлежащий замене.
Второй параметр задает заменяющий файл content1.txt.
Третий параметр задает маску обрабатываемых файлов — все htm и html файлы текущего каталога.
Добрый день.
Эта программа решит подобную задачу?
Пример.
Дано:
Руководство
Мерседес. Рулевое управление
Текст
Требуется:
Руководство Мерседес. Рулевое управление (добавить к содержимому тайтла, содержимое h1)
Мерседес. Рулевое управление
Текст
Файлов около 50 000, тайтл везде одинаковый, h1 разный.
Спасибо
Теги не прошли
head
title Руководство /title
/head
body
h1 Мерседес. Рулевое управление /h1
p Текст /p
/body
/html
Требуется:
head
title Руководство Мерседес. Рулевое управление (сделать тайтл+h1) /title
/head
body
h1 Мерседес. Рулевое управление /h1
p Текст /p
/body
/html
Добрый день, если весь текст html в одну строку, то да, может, через регулярное выражение с группами. Если текст разбит по строкам, то нет, не сможет, тогда лучше скриптом. Python или JScript, например.
Добрый день. Меня заинтересовали возможности этой программы но из-за командной строки боюсь не освою ее. Хочу спросить об одной конкретной функции.
Допустим есть текстовый файл, *.json, в нем обычный UTF8 текст. Около 800 очень длинных строчек. В некоторых строчках присутствует текст
Variables.value(111)][72] = ‘夜這い’
и это не вся строчка и лишь ее часть. Нужно найти весь подобный текст, заменить японский текст на заранее указанный русский текст, и в конце русского текста добавить нумерацию обозначающую в какая по счету это замена. Примерно так должно получится
Variables.value(111)][72] = ‘Русский текст 1’
Variables.value(111)][72] = ‘Русский текст 2’
Variables.value(111)][72] = ‘Русский текст 3’ и так далее.
Это можно сделать с помощью этой программы? И если да, то как
Добрый день, такой возможности как нумерация замен, в программе нет.
Здравствуйте! Возможна ли пакетная замена многострочного блока в файлах?
Допустим, есть несколько десятков страниц с одинаковым блоком «меню» (меню прописано не одним десятком строк).
Нужно поменять меню во всех файлах.
Возможно ли «скормить» программе файл с большим текстом, подлежащим замене, и второй файл — с текстом, который нужно вставить вместо.
Вариант сборки файлов из html в данном случае не подходит, потому что нет маленькой строки-маркера, которую нужно найти и заменить на блок текста. Нужно заменить именно один блок текста на другой блок текста.
Здравствуйте, да, конечно!
Файл с текстом для поиска задаётся через -spf, файл с заменяющим текстом через -f-f, файлы для обработки по маске.
Stdout (>) не работает.
например?
Можно как-то не перезаписывать оригинальный файл, а создавать новый?
назначение программы — заменять текст в существующих файлах. создание нового файла можно сделать, например, копированием в bat файле
Добрый день,
прошу помочь с задачей:
в html файле регуляка —
href="/resume/(.*?(\d{8}).html"
) находит все интересующие вхождения.Как реализовать поиск с последующей заменой всех вхождений только на цифровые значения с помощью nhutils, спасибо
Добрый день, не очень понял, что значит, с заменой только на цифровые значения? Вероятно, это про capture groups. Можете объяснить подробнее или написать пример, что на что должно заменяться?
привет… мне нужно сделать тысячи замен искомого на GUID-значение… вообще делаю замены с помощью nhrt, но сейчас нет в нем возможности генерации GUID-значений при замене… не сложно ли добавить такую возможность?
перейдя с windows на linux, nhrt лучшее что работает на замену пакетным заменам по шаблону, которые я делал в AkelPad, ибо AkelPad в linux не заводится касательно работы скриптов…
Добрый день, возможно, проще будет генерировать GUID в командной строке, например, Generate GUID in Windows with batch file
спасибо за ответ…
в AkelPad тогда будет проще сгенерировать, только вот придется делать эту работу на другом компе…
http://akelpad.sourceforge.net/forum/viewtopic.php?p=33411#33411
жаль…
Как сделать переход на следующую строчку после замены на G00 &
-spt:»G01″ -i -t:»G00″
Если вопрос в том, чтобы вставить в заменяемый текст перевод строки, то для этого лучше использовать параметр -escapetext (-et), который поддерживает символы
\",\r,\n,\\,\xHH,\uHHHH
для замены:Если вопрос в чем-то другом, напишите подробнее.
Да. Вы меня правильно поняли. Всё работает. И ещё вопросик. Есть набор произвольных чисел, к примеру 1521, 2734, 152. Как сделать так что бы после единиц появилась точка ? То есть должно получится:
152,1
273,4
15,2
Я бы сделал заменой регулярными выражениями -formattedtext (-ft), вставляя точку между группами $1 и $2:
Входной файл
Результат
Всё заработало. Спасибо вам огромное. И ещё возник вопрос. Есть огромное количество текста типа:
N1
N2
N3
N4
—
N100
Но по какой то причине запись типа:
-sre:»N[0-999]» -t:»»
удаляет только строки от N1 до N9, а N10 превращает в 0. Как это исправить ?
Квадратные скобки в регулярном выражении задают набор символов (а не диапазон чисел), поэтому ваше выражение задаёт выражение из одной цифры.
Здесь нужно
N\d+
– ненулевое число цифр илиN\d{1,3}
– от одной до трёх цифр.Помогите пожалуйста разобраться с заменой по регулярному выражению
Нужно найти все вхождения:
Text1…неизвестное_количество_пробелов…Text2
и заменить на:
Text1_один_пробел_Text2
Заранее благодарю!
Проще через -ft (-formattedtext)
спасибо большое — отлично сработало!
но есть доп.вопрос:
как быть, если «неизвестное_заранее_количество_пробелов» может начинаться с «0», а не с «1» ?
Просто замените символ плюс на звездочку.
Спасибо большое! 8-)
Почему такая простая программа не работает в Windows XP SP2?
В смысле «не работает в Windows XP SP2»? По тексту написано, что работа программы nhreplace проверена в нескольких версиях Windows, включая Windows XP.