grep весь текст на основе ключевых слов - PullRequest
0 голосов
/ 05 мая 2020

У меня есть файл, состоящий из oracle операторов выбора, как указано ниже.

select count(*) into v_cnt from table;
select
  max(num) into v_max 
from table2;
select numm from table3;

вывод приведен ниже -

select count(*) into v_cnt from table;
select
  max(num) into v_max 
from table2;

Мне нужна помощь в поиске операторов выбора (от ключевого слова select до точки с запятой), которые входят в ключевое слово. Операторы select могут содержать n строк. выбирается начало строки. конец строки - точка с запятой. между этими ключевыми словами, если у нас есть в тексте. тогда нам нужно захватить всю линию. Я пытаюсь выполнить инструкцию grep / awk. но я не получаю точно. операторы выбора нескольких строк не работают. Любые идеи / предложения с вашей стороны. Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 05 мая 2020

С GNU awk для многосимвольного RS:

$ awk 'BEGIN{RS=ORS=";\n"} /into/' file
select count(*) into v_cnt from table;
select
  max(num) into v_max
from table2;

С любым awk:

$ awk -v RS=';' -v ORS=';\n' '/into/{sub(/^\n/,""); print}' file
select count(*) into v_cnt from table;
select
  max(num) into v_max
from table2;
0 голосов
/ 05 мая 2020

awk: issel запоминает, не хватало ли в select;:

{
        if (issel = (issel || $0 ~ /select/)) print $0;

        issel = !( $0 ~ /;/)
}
0 голосов
/ 05 мая 2020

Попробуйте следующее:

tr '\n' '~' < <Input file> | sed 's#;#\n#g' |  grep -i 'select.*into.*' | tr '~' '\n'

Демо:

$cat file.txt 
select count(*) into v_cnt from table;
select
  max(num) into v_max 
from table2;
select numm from table3;
$tr '\n' '~' < file.txt | sed 's#;#\n#g' |  grep -i 'select.*into.*' | tr '~' '\n'
select count(*) into v_cnt from table

select
  max(num) into v_max 
from table2
$

0 голосов
/ 05 мая 2020

Perl спешит на помощь!

perl -0x3b -ne 'print if /\binto\b/'
  • -0x3b устанавливает разделитель записей на символ x3b, т.е. ;
  • -n считывает входная запись за записью, запуск кода для каждого
  • \b совпадает с границей слова, поэтому все записи, содержащие «в», не являющиеся частью более длинного слова, должны быть напечатаны

Если есть некоторые команды, которые не начинаются с select, и вы хотите их пропустить, измените условие на if /^select\b/m && /\binto\b/ (которое может быть включено в одно регулярное выражение if /^select\b.*\binto\b/ms). Чтобы сделать регулярные выражения нечувствительными к регистру, добавьте модификатор /i: /^select\b/mi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...