Отрицательный взгляд с помощью grep (на macOS) - PullRequest
0 голосов
/ 15 сентября 2018

Я работаю с каталогом сценариев SQL и пытаюсь найти упоминание tables.table, которому не предшествует JOIN или FROM (потому что я пытаюсь определить, какие сценарии могут на самом деле изменять tables.table, а не читатьот него).Поэтому я пытаюсь использовать отрицательный взгляд за , но мне интересно, не реализовано ли это просто на macOS grep, потому что оно не работает для меня.Вот что я использую:

grep -r "(?!JOIN )tables.table"

И MacOS печатает:

-bash: !JOIN: event not found

Я использую 10.13.16 macOS High Sierra на случай, если что-то изменится.Мои вопросы:

(1) Могу ли я негативно взглянуть на MacOS, и если да, то как?(2) Как я могу сделать отрицательный взгляд за спиной, который включает «или» (потому что я хочу найти случаи, где ни JOIN, ни FROM не предшествуют tables.table.

**** Редактировать ****

Я попытаюсь предоставить MCVE (который, как я думал, у меня был выше), сгенерировав файлы примеров и объяснив проблему более подробно.У меня есть массивный и очень глубокий набор каталогов, содержащих сценарии SQL (иногда 4-5уровень каталогов ниже). Я не знаком с этими сценариями SQL, но меня попросили попытаться определить, какие сценарии SQL изменяют конкретные таблицы. С этой целью я хочу рекурсивно находить строки во всех этих файлах SQL, вложенных глубоко в различные каталоги.и подкаталоги, которые содержат упоминание конкретной таблицы (назовем ее table.tables), но только если имени этой таблицы не предшествует слово JOIN или FROM, поскольку это указывает на то, что это источник данных и не изменяется.

Допустим, у меня есть следующий набор файлов (с их путевыми именами):

/scripts/analysisA/prod/script.SQL который содержит следующий текст:

blah blah blah
FROM table.tables

/scripts/analysisB/script2.SQL, который содержит следующий текст:

blah blah blah
INNER JOIN table.tables

/scripts/script3.SQL, который содержит следующий текст:

UPDATE table.tables
blah blah blah

тогда я хотел бы получить результат, который /scripts/script3.SQL содержит строку UPDATE table.tables, и это будет мой единственный возвращаемый результат для вышеупомянутого.

Я открыт для всех предложений о том, как этого добиться.Еще раз спасибо.

1 Ответ

0 голосов
/ 16 сентября 2018

Вы не предоставили MCVE, так что я предполагаю, что этот скрипт, который просто проверяет, появляется ли JOIN или FROM в той же строке, что и tables.table, может быть всем, что вам нужно:

awk '!/JOIN|FROM/ && /tables\.table/' file

или если вам действительно нужно проверить, ЧТО ПРИСОЕДИНЯЕТСЯ или ОТ ВХОДА до tables.table:

awk 's=index($0,"tables.table") && substr($0,1,s-1)!~/JOIN|FROM/' file

Каждый из этих сценариев будет вести себя последовательно, используя любой awk в любой оболочке в любой системе UNIX. Если ни то, ни другое не соответствует вашим ожиданиям, отредактируйте ваш вопрос, включив в него отсутствующий MCVE.

...