Я работаю над некоторыми скриптами bash с awk для поиска во многих файлах и возврата различных комбинаций строк, которые соответствуют различным комбинациям условий.
Я хотел бы каким-то образом добавить возможность для моих скриптов обрабатывать простые, но общие логические выражения "запрос" - такие вещи, как:
A AND (B OR C) AND NOT D
где A, B, C и D будут переменными bash или awk со значениями, такими как TRUE=0
и FALSE!=0
, или наоборот.
Мой код устанавливает каждую из переменных, а затем передает логическое выражение с использованием этих переменных чему-то, что может его оценить.
На самом деле мне не нужно ничего особенного, например, вложенные скобки, но один уровень действительно поможет. Мне не нужна обширная проверка/восстановление ошибок выражений. Если я пишу плохое выражение, это моя проблема, если оно не уничтожает остальную часть моего скрипта чем-то вроде синтаксической ошибки bash/awk.
Решение может быть родным для bash или awk или внешней программой, вызываемой из любого языка, которая возвращает true или false (0/1).
Я знаю, как жестко закодировать такие вещи с помощью операторов if и т. д., но мне нужно иметь возможность изменять условия для каждого поиска, поэтому это нельзя жестко закодировать.
Я определенно недостаточно знаю, чтобы собрать свой собственный парсер с чем-то вроде lex/yacc.
Такие инструменты, как sed
, find
и grep
, великолепны, но (по крайней мере, сами по себе) они не будут делать то, что мне нужно, и слишком разборчивы в синтаксисе, чтобы использовать их для написания специальных запросов.
В качестве одной из альтернатив я думаю о том, чтобы попытаться преобразовать мои запросы в простую математику и провести их через (( query ))
в bash - например. для приведенного выше примера (без использования полностью защищенного синтаксиса, чтобы сделать пример уродливым, и со всеми переменными, установленными в 1 для истинного и 0 для ложного).
(( $A * ($B + $C) * (! $D) ))