Эта страница содержит справочную информацию об использовании программы nhrt. Информация относится к новой версии программы.
Поиск и замена обычного текста
Поиск и замена по регулярному выражению
Замена текста по списку действий
Поиск и замена обычного текста
При запуске со следующими параметрами программа выполняет поиск простого текста (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
Задает удаление текста, не отвечающего регулярному выражению.
Параметр добавлен в версии 2.13.
Используется совместно с –sre и задает вывод только текста, отвечающего регулярному выражению:
-sre:<regex> -fet:"$0\r\n"-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.
А как удалить строку вне зависимости от текста в ней? Т.е. есть много файлов текстовых. И я хотел бы удалять заголовки в них (обычно одна или две первые строчки). Спасибо.
Через регулярные выражения, параметр sre.
Например, вот эта команда удаляет первую строку из текстового файла:
nhrt.exe -occ:1 -sre:".*(\r\n)+" -e file.txt
Если надо удалить из файла первые две строки :
nhrt.exe -occ:1,2 -sre:".*(\r\n)+" -e file.txt
Добавил примеры.
Как удалить первую строку файла
Как удалить вторую строку файла
Соответственно, чтобы удалить первые две строки, нужно указать
-occ:1,2
— Как удалить одну строку или несколько строк по их номерамПриветствую
NHRT какую версию ECMA поддерживает?
я как понимаю, минимум до ECMA 2018, ибо не поддерживает именованные группы
на какую версию надо ориентироваться?
Здравствуйте, по номеру точно не скажу, наверное, пятую. Сейчас используется библиотека regex из VC2010. Описание того, что поддерживается см. Какой синтаксис регулярных выражений используется в программе nhrt?
Здравствуйте! Есть текстовый файл с n строк. В конце каждой строки мне нужно поставить три запятые ,,,
Подскажите, пожалуйста, как это можно сделать.
Примерно такая строка, наверное —
nhrt -cp:1251 -sre:»?????????» -t:»,,,» 1.txt
Что должно быть вместо знаков вопроса? И нужен ли тут -t:»,,,» символ возврата каретки?
В принципе решил через
Setlocal EnableExtensions
set filein=1.csv
set fileout=2.txt
for /f «usebackq skip=1 delims= eol=» %%a in («%filein%») do Echo %%a,,,>>»%fileout%»
Долго, но эффективно. Если есть решение через программу, то буду рад.
Добрый день, вот так можно
nhrt -sre:"[\r\n]+" -ib -t:",,," -o:d 20210730.txt
Спасибо большое! Так получилось и гораздо быстрее, чем мой первоначальный вариант.
Здравствуйте!
Есть две строки в файле
«dataVersionName» : «0102»,
«dataRomVersionCode» : «0102»,
где 0102 — дата, определяемая по
set curver=%dd%%mm% и подставляемая в виде %curver%.
Эти две строки расположены в середине текстового файла, требуется замена только даты.
Помогите, пожалуйста, реализовать замену даты на актуальную с помощью nhrt.exe. Есть ли возможность не учитывать некоторые символы в искомом тексте? Или как еще можно заменить?
Добрый день,
можно использовать positive assert https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/bb982727(v=vs.100)?redirectedfrom=MSDN
как-то так
(?=«dataVersionName» : «)(\d{4})(?=»,)
Решил таким образом
powershell -Command «(gc config.json) -replace ‘\»[0-9][0-9][0-9][0-9]\»‘, ‘\»%curver%\»‘ | Out-File -encoding utf8 config.json»
Всем здравствуйте
Пожалуйста, будьте так любезны, помогите
Есть строки типа
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
Спасибо.
дубль https://nhutils.ru/blog/nhrt/q_a/comment-page-1/#comment-59209 ?
Привет.
как с помощью nhrt превратить строки типа
«content»: «11 — 17»,
в
«content»: «11»,
«content»: «12»,
«content»: «13»,
«content»: «14»,
«content»: «15»,
«content»: «16»,
«content»: «17»,
просто такое надо сделать в более тысячи файлах.
Тулза отличная, пользуюсь давно и много. Но вот непонятно, можно ли в ней использовать функции…
Добрый день, программа так не умеет, функций в нет. По крайней мере, сейчас. Такую задачу я бы делал через скрипт, например, JScript.
Привет
Столкнулся с нуждой, чтобы регистр не учитывался. Я и не думал, что nhrt по умолчанию чувствителен к регистру. Зачем?
Сутки ушло на разгадку, почему мои команды не работают!!! Оказалось, что регистр учитывается.
Ладн, надо же отключить регистр. Но как? В батнике пишу как я привык команду для замены из файла, и куда бы я не ставил -i или -ignorecase в батнике, регистр учитывается. Пришлось в сто четырнадцать тысяч строк добавлять -i.
А почему такое нельзя раз написать в батнике для всей обозначенной работы?
Добрый день,
Во большинстве программ по умолчанию идет поиск и сравнение с учетом регистра —
find
,findstr
, тот жеgrep
. И в библиотеках так же —std
,regex
. Так и в nhrt.Насчёт прописывания параметров по умолчанию, можно попробовать, посмотрю, что можно сделать.
Добрый вечер.
Команда -append через -list «отказывается» выполняться.
nhrt -list:list rep.txt
а в list.txt строка
- append -t:"TEST"
Здравствуйте,
Спасибо за сообщение.
Это ошибка, поправим.
Здравствуйте, исправлено в nhrt v2.14.
Благодарю за программу и Ваш труд.
Можно уточнить, если использовать для поиска и замены фраз список -list,
то при получении результата успешных замен он выводится на экран.
nhrt v2.13.0.15 * Замена текста в файлах * http://nhutils.ru/nhrt/
text.txt UTF-8 : 5
Мне важно знать (получить для дальнейшей обработки) число успешных замен, в данном случае 5. Возможно ли как-то это получить? «Типа» кода ошибки 0 1 2. Допустим в файле списке указано 6 строк замен и таких файлов несколько и у каждого своё число строк поиска-замен. Либо на выходе после запуска программы и обработки по списку мне важно узнать все строки были успешно заменены или нет.
т.е. возвращать число замен в коде возврата?
Здравствуйте, в nhrt v2.14 добавлена возможность выводить количество замененных вхождений в код возврата вместо кода ошибки.
отличная программа! спасибо!
Не работает удаление пробела в начала или конце строки следующими простыми командами:
-sre:" $" -e
-sre:"^ " -e
Я понимаю, что это особенность регулярных выражений ECMAScript, и символы «^» и «$» означают начало и конец ввода, а не строки. Это можно переопределить с помощью флага m. Но в nhrt этот флаг установить нельзя.
Почему-то еще не работает регулировка жадности квантификатора:
Выражение
-sre:"^.*?" -e
для строки
текст1текст2
удаляет всю строку, а не часть текст1
Непонятно, нужен пример, какой текст и какой результат ожидается.
Сейчас попробовал – работает.
-sre:"^Датчик.*й"
удаляет больше,-sre:"^Датчик.*?й" -e
удаляет меньше.В библиотеке std::regex MSVC2010, в которой собрана программа, нет поддержки режима m (Multiline).
Можно делать замену с positive assert (?=)
-sre:"^ " -e
-sre:"(?=\n) " -e
-sre:" $" -e
-sre:" (?=\r\n)" -e
Спасибо за напоминание такого способа.
Для справки, все дальнейшие команды я выполнял из списка замен с помощью команды -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, тогда будут произведены замены на всех строках, а не только в начале файла.
Небольшая ошибка в первой команде для удаления пробела в конце файла.
Вместо
-sre:" (?=\r|\n|$)" -e
должно быть
-sre:" $" -e
Подскажите, пытаюсь сделать пакетную обработку файлов.
Но мне нужно перекодировать только ansi в utf8
Как сделать чтобы файлы других кодировок не трогало?
Такой фильтрации файлов по кодировке в программе не предусмотрено. Предполагается, что вся фильтрация делается указанием маски на имя файла.
Доброе)
Имеется код
@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
Как объединить команды в одну строку по списку действий? Пытался сделать по приведенному шаблону, но не получается…
Получилось!
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
Добрый день, спасибо за дополнение!
Добавил теги, чтобы кавычки не ломались.
Я так понимаю, что возможности прописывать функции нет? типа, в замене писать условия (разумеется, не русскими буквами), типа если а равно б, то нужно сделать такую замену/добавление
Функций нет.
А на что имеется в виду условие? На содержимое найденного текста?
да, типа так — поиск ведется по двум строкам, в регулярке несколько групп, и если, к примеру, содержимое группы 2 совпадает с содержимым группы 6, то обработаться должно так-то и так-то
типа вот как здесь показано, такое было бы просто потрясающе, правда нужна еще многостраничная замена при таком
http://akelpad.sourceforge.net/forum/viewtopic.php?p=32415#32415
это можно сделать в скрипте JS/VBS – сделать и простое сравнение, и какое-то другое условие
полный скрипт замены текста есть здесь
к сожалению, я не силен в делании скриптов, так что видимо у меня проблемы в задачах…
буду ставить другие задачи…
вопросов больше нет…
Есть ли возможность комментирования в списке команд в файле, который используется в параметре -list?
Нет, комментарии не предусмотрены
это действительно необходимо? сейчас готовится новая версия, можно добавить
Было бы не плохо. Сейчас выкрутился из ситуации с помощью конструкции -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 сек.
Спасибо за подробное сообщение!
Добавлю комментарии в следующей версии.
По длинным строкам пока непонятно, почему с ними так получается — посмотрю.
Не получилось воспроизвести проблему с длинными строками.
У меня -sre:\d+ -e на 1 МБ файле выполняется одинаково за < 0,5с и на файле со множеством коротких строк, и при переносе всего текста в одну строку. Может, связано с конкретным файлом и небольшим количеством замен (<600), тогда нужен реальный пример, чтобы проверить.
Вот пример из 8 млн. символов. Лучше сразу уменьшить до миллиона.
https://yadi.sk/d/AOiuRhN81chwFA
Версия утилиты 2.11.0.13.
Windows 10 Pro x64.
Intel i5-3570K 3,4 ГГц
Хороший файл, спасибо! Почти 2 млн замен, у меня обрабатывается больше часа.
После некоторого анализа я пришел к выводу, что после каждой замены в строке идет или просмотр или копирование оставшейся строки.
В таком случае на моих данных время, которое затрачивается в каждой следующей итерации, уменьшается, а общее время, за вычетом времени замены, пропорционально (x+1)*x/2, где x — количество замен. Если упростить, то пропорционально x^2. Это предположение хорошо соотносится с предыдущим замером времени.
https://nhutils.ru/blog/nhrt-v2-12-0/
Спасибо!
Надеюсь, когда-нибудь будет реализована и многопоточная (параллельная) обработка файлов и исправлена ситуация с долгой обработкой длинных строк.
Улучшение при большом количестве замен будет в следующей версии. По параллельной обработке пока ничего сказать не могу.
исправлено в nhrt v2.13
Спасибо за труд, отличная программа! Жаль только , что нет «режима фильтра» (из STDIN в STDOUT без использования временных файлов — наподобие sed), а то бы вообще цены ей не было! :)
Спасибо за отзыв и хороший вопрос!
Программа nhreplace поддерживает замену в стандартных потоках, примерно так:
… | nhrplc -list:"0f-list-list.txt",auto -notitle | …
Но в справке эта возможность, действительно, не описана. В ближайшее время дополним справку.
Добавлены описание и пример использования