Как исправить ошибку agrep: шаблон слишком длинный (имеет › 32 символа) он не показывает ошибку, если в строке нет точки?

Agrep выдает ошибку agrep: pattern too long (has > 32 chars), когда в строке шаблона есть точка (.), но не в противном случае.

Я хочу сравнить (приблизительно) две строки, поэтому я использую для этого agrep, но он дает ошибку agrep: pattern too long (has > 32 chars) . Но я обнаружил, что это не дает ошибки, если в строке шаблона нет точки (почему?)

`echo "The quick brown fox jumped over the lazy dog." | agrep -c -4 "The quick brown fox jumped over the lazy dog."`

ожидаемый результат равен 1, вместо этого выдается ошибка: agrep: pattern too long (has > 32 chars)

это работает, если я удалю точку:

$ echo "The quick brown fox jumped over the lazy dog." | agrep -c -4 "The quick brown fox jumped over the lazy dog"  
1

person Manik    schedule 17.08.2019    source источник
comment
Из man agrep: Ограничение длины записи можно изменить, изменив параметр Max_record в файле agrep.h.   -  person Cyrus    schedule 17.08.2019
comment
@Cyrus это работает, если в строке шаблона нет точки, независимо от того, насколько велика строка.   -  person Manik    schedule 17.08.2019
comment
Может быть, вы хотите взглянуть на tre-agrep.   -  person Cyrus    schedule 17.08.2019
comment
@Cyrus, можете ли вы сказать мне, как я могу использовать tre-agrep для строки, а не для всего файла? Я пробовал echo "the quick brown fox jumped over the lazy dog." | tre-agrep -4 "the quick brown fox jumped over the lazy dog, но он просто повторяет строку   -  person Manik    schedule 17.08.2019
comment
Вы имеете в виду, что? echo "The quick brown fox jumped over the lazy dog." | tre-agrep -c -4 "The quick brown fox jumped over the lazy dog."   -  person Cyrus    schedule 17.08.2019
comment
@Cyrus да, точка теперь работает, но tre-agrep не передает эхо   -  person Manik    schedule 17.08.2019
comment
Непонятно, какой результат вы хотите.   -  person Cyrus    schedule 17.08.2019
comment
@Cyrus Я хочу сравнить две строки, примерно, команда должна вернуть True (1), если они совпадают (приблизительно), или False (0), если они не совпадают. Обычно agrep или tre-agrep сравнивает шаблон со строками в файле, но я хочу сравнить со строкой. в идеале это должно быть что-то вроде command -c -4 "string_to_compare" "pattern_string" output 1 или 0 соответственно   -  person Manik    schedule 17.08.2019


Ответы (2)


Приблизительное сопоставление строк/нечеткий поиск строк с двумя строками.

С agrep и bash:

if agrep -1 "abc" <<< "xbc" >/dev/null; then echo "match"; else echo "no match"; fi

или с tre-agrep и bash:

if tre-agrep -q -1 "abc" <<< "xbc"; then echo "match"; else echo "no match"; fi

Вывод в обоих случаях:

match
person Cyrus    schedule 17.08.2019
comment
почему он показывает совпадение для if tre-agrep -q -1 "abc" <<< "xbcdefadf"; then echo "match"; else echo "no match"; fi? -1 максимально допустимое количество ошибок не применяется - person Manik; 17.08.2019
comment
abc с одной ошибкой является подстрокой xbcdefadf. Совпадение начинается с позиции 0 и заканчивается после 3 символов. См.: tre-agrep -1 --show-position "abc" <<< "xbcdefadf" - person Cyrus; 17.08.2019
comment
Есть ли способ сравнить две строки, чтобы найти максимальное количество ошибок во всей строке. я не хочу искать строку в файле, но проверяю, совпадает ли строка (строка) примерно со строкой операнда (например, если это просто опечатка или совершенно другая строка), т.е. не должна соответствовать быстрой коричневой лисе, через которую перепрыгнул ленивая собака все предложение должно быть примерно таким же - person Manik; 17.08.2019
comment
Я рекомендую начать новый вопрос, потому что это выходит за рамки. - person Cyrus; 17.08.2019
comment
agrep -x: «шаблон должен соответствовать всей строке» делает то, что я искал, но все равно показывает, что шаблон ошибки слишком длинный (содержит › 32 символа). Можете ли вы сказать мне, как изменить ограничение длины шаблона с помощью agrep.h? Я нашел файл /usr/bin/agrep, но не знаю, что изменить. - person Manik; 17.08.2019

Проблема в том, что agrep обрабатывает . как метасимвол. Чтобы избежать этого, вы должны передать опцию -k:

echo "The quick brown fox jumped over the lazy dog." | agrep -c -4 -k "The quick brown fox jumped over the lazy dog."

Страница руководства по agrep говорит:

-k Никакой символ в шаблоне не рассматривается как метасимвол.

person desgua    schedule 12.12.2020