Попробуйте что-нибудь вроде этого:
$ ls *ext | grep -P '[^)]\.ext' | xargs -iXXxxFILEXXxx mv XXxxFILEXXxx target/
grep
отфильтрует файлы со скобками в именах, а xargs
выполнит команду mv
для результатов. Уродливая метка XXxxFILEXXxx
предназначена для размещения имен файлов в качестве аргумента mv
.
Как насчет следующего:
awk 'BEGIN{FS="cast\\(";OFS="\n\n"}{ for(i = 1; i <= NF; i++) { sub("[ ),].*","",$i);gsub("^.*\\(","",$i) } {$1=""; print}}'
Это решение перебирает экземпляры «cast (» в любой строке, а затем удаляет префиксы и суффиксы.
Для поиска 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
.