Для поиска field<decimals>
вхождений внутри cast(...)
операторов, при условии отсутствия несоответствующих скобок, с GNU grep
или совместимой сборкой с поддержкой PCRE:
<abc.txt grep -Po 'cast(\((?:[^()]++|(?1))*\))' |
grep -Po '\bfield\d+\b'
Это использует способность PCRE определять рекурсивные регулярные выражения. Выше (?1)
относится к регулярному выражению, заключенному в (...)
, поэтому мы ищем cast
, за которым следует регулярное выражение «R», начинающееся с (
, за которым следует любое количество скобок, отличных от -(++
. ] — это просто не-версия с возвратом+
)или более букв «R», за которыми следует )
.
Это позволяет нам найти паросочетание )
для открытия (
, следующего за cast
.
Второй grep
извлекает только field<decimal>
(, окруженные границами слов(\b
))из тех cast(...)
утверждений, которые извлекает первый grep
.
Это предполагает, что эти операторы SQL находятся в одной строке. Если нет, вы можете добавить опцию -z
к первой grep
.