NAME
App::Greple::tee - модуль для замены совпадающего текста на результат внешней команды
SYNOPSIS
greple -Mtee command -- ...
VERSION
Version 1.02
DESCRIPTION
Модуль Greple's -Mtee посылает совпавшие части текста заданной команде фильтра и заменяет их результатом команды. Идея взята из команды teip. Это подобно обходу частичных данных внешней командой фильтрации.
Команда фильтрации следует за объявлением модуля (-Mtee
) и заканчивается двумя тире (--
). Например, следующая команда вызывает команду tr
с аргументами a-z A-Z
для найденного слова в данных.
greple -Mtee tr a-z A-Z -- '\w+' ...
Приведенная выше команда преобразует все совпадающие слова из нижнего регистра в верхний. На самом деле этот пример не так полезен, потому что greple может сделать то же самое более эффективно с помощью опции --cm.
По умолчанию команда выполняется как один процесс, и все совпадающие данные отправляются в него вперемешку. Если совпадающий текст не заканчивается новой строкой, то она добавляется перед отправкой и удаляется после получения. Входные и выходные данные сопоставляются построчно, поэтому количество строк ввода и вывода должно быть одинаковым.
При использовании опции --discrete для каждой совпадающей области текста вызывается отдельная команда. Разницу можно определить по следующим командам.
greple -Mtee cat -n -- copyright LICENSE
greple -Mtee cat -n -- copyright LICENSE --discrete
Строки входных и выходных данных не должны быть одинаковыми при использовании опции --discrete.
OPTIONS
- --discrete
-
Вызвать новую команду индивидуально для каждой сопоставленной детали.
- --bulkmode
-
При использовании опции <--discrete> каждая команда выполняется по требованию. Опция <--bulkmode> option causes all conversions to be performed at once.
- --crmode
-
Эта опция заменяет все символы новой строки в середине каждого блока на символы возврата каретки. Возврат каретки, содержащийся в результате выполнения команды, возвращается обратно к символу новой строки. Таким образом, блоки, состоящие из нескольких строк, можно обрабатывать партиями без использования опции --discrete.
- --fillup
-
Объединить последовательность непустых строк в одну строку перед передачей ее команде фильтрации. Символы новой строки между символами большой ширины удаляются, а остальные символы новой строки заменяются пробелами.
- --squeeze
-
Объединяет два или более последовательных символов новой строки в один.
- -ML --offload command
-
Опция --offload в teip(1) реализована в другом модуле App::Greple::L (-ML).
greple -Mtee cat -n -- -ML --offload 'seq 10 20'
Вы также можете использовать модуль -ML для обработки только четных строк следующим образом.
greple -Mtee cat -n -- -ML 2::2
LEGACIES
Опция --blocks больше не нужна, поскольку в модуле greple реализована опция --stretch (-S). Вы можете просто выполнить следующее.
greple -Mtee cat -n -- --all -SE foo
Не рекомендуется использовать опцию --blocks, поскольку в будущем она может быть устаревшей.
- --blocks
-
Обычно внешней команде передается область, соответствующая заданному шаблону поиска. При указании этой опции будет обрабатываться не совпадающая область, а весь блок, содержащий ее.
Например, чтобы отправить внешней команде строки, содержащие шаблон
foo
, необходимо указать шаблон, соответствующий всей строке:greple -Mtee cat -n -- '^.*foo.*\n' --all
Но с опцией --blocks это можно сделать следующим образом:
greple -Mtee cat -n -- foo --blocks
С опцией --blocks этот модуль ведет себя более похоже на модуль teip(1) с опцией -g. В остальном поведение аналогично teip(1) с опцией -o.
Не используйте --blocks с опцией --all, так как блок будет представлять собой все данные.
WHY DO NOT USE TEIP
Прежде всего, всегда, когда вы можете сделать это с помощью команды teip, используйте ее. Это отличный инструмент и намного быстрее, чем greple.
Поскольку greple предназначен для обработки файлов документов, он имеет много функций, которые подходят для этого, например, управление областью соответствия. Возможно, стоит использовать greple, чтобы воспользоваться этими возможностями.
Кроме того, teip не может обрабатывать несколько строк данных как единое целое, в то время как greple может выполнять отдельные команды на куске данных, состоящем из нескольких строк.
EXAMPLE
Следующая команда найдет текстовые блоки внутри документа стиля perlpod(1), включенного в файл модуля Perl.
greple --inside '^=(?s:.*?)(^=cut|\z)' --re '^([\w\pP].+\n)+' tee.pm
Вы можете перевести их с помощью сервиса DeepL, выполнив приведенную выше команду, соединенную с модулем -Mtee, который вызывает команду deepl следующим образом:
greple -Mtee deepl text --to JA - -- --fillup ...
Однако для этой цели более эффективен специализированный модуль App::Greple::xlate::deepl. Фактически, подсказка для реализации модуля tee пришла из модуля xlate.
EXAMPLE 2
Следующая команда обнаружит в документе LICENSE часть с отступами.
greple --re '^[ ]{2}[a-z][)] .+\n([ ]{5}.+\n)*' -C LICENSE
a) distribute a Standard Version of the executables and library files,
together with instructions (in the manual page or equivalent) on where to
get the Standard Version.
b) accompany the distribution with the machine-readable source of the Package
with your modifications.
Вы можете переформатировать эту часть, используя модуль tee с командой ansifold:
greple -Mtee ansifold -rsw40 --prefix ' ' -- --discrete --re ...
a) distribute a Standard Version of
the executables and library files,
together with instructions (in the
manual page or equivalent) on where
to get the Standard Version.
b) accompany the distribution with the
machine-readable source of the
Package with your modifications.
Опция --discrete запускает несколько процессов, поэтому процесс будет выполняться дольше. Поэтому можно использовать опцию --separate '\r'
с ansifold
, которая выдает одну строку, используя символ CR вместо NL.
greple -Mtee ansifold -rsw40 --prefix ' ' --separate '\r' --
Затем преобразуйте символ CR в NL с помощью команды tr(1) или другой.
... | tr '\r' '\n'
EXAMPLE 3
Рассмотрим ситуацию, когда требуется выполнить поиск строк в строках, не являющихся заголовками. Например, нужно найти имена образов Docker из команды docker image ls
, но оставить строку заголовка. Это можно сделать с помощью следующей команды.
greple -Mtee grep perl -- -ML 2: --discrete --all
Опция -ML 2:
извлекает предпоследние строки и отправляет их команде grep perl
. Опция --discrete необходима, поскольку количество строк ввода и вывода меняется, но поскольку команда выполняется только один раз, недостатка в производительности нет.
Если попытаться сделать то же самое с помощью команды teip, то teip -l 2- -- grep
выдаст ошибку, поскольку количество выходных строк меньше количества входных. Однако с полученным результатом проблем нет.
INSTALL
CPANMINUS
$ cpanm App::Greple::tee
SEE ALSO
App::Greple::tee, https://github.com/kaz-utashiro/App-Greple-tee
https://github.com/greymd/teip
App::Greple, https://github.com/kaz-utashiro/greple
https://github.com/tecolicom/Greple
BUGS
Опция --fillup
удаляет пробелы между символами хангыля при конкатенации корейского текста.
AUTHOR
Kazumasa Utashiro
LICENSE
Copyright © 2023-2025 Kazumasa Utashiro.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.