Supondo que o SQL use ; como delimitadores de instrução:
$ cat statements.sql
First bit;
Second thing;
More
of the same;
select * from dept where department_name in ('abc'
, 'xyz', 'def') ;
Getting to the end;
The
End;
Em seguida, você pode usar ; como o separador de registro em awk e combinar como de costume:
$ awk 'BEGIN { RS=";" } /department_name in ([^)]+)/ { print $0 ";" }' statements.sql
select * from dept where department_name in ('abc'
, 'xyz', 'def') ;
O padrão, /department_name in ([^)]+)/ corresponde à string department_name in ( seguido por um ou vários caracteres que não são ) (incluindo novas linhas), seguidos por um único ) .
A instrução print adiciona ; ao final do registro, já que ; foi removido por awk (remove todos os separadores de registro).
Você obterá algumas linhas em branco extras, já que havia linhas em branco após o ; precedente no arquivo. Você pode filtrá-los com sed -n '/[[:graph:]]/p' :
$ awk 'BEGIN {RS=";"} /department_name in ([^)]+)/ { print $0 ";" }' statements.sql |
sed -n '/[[:graph:]]/p'
select * from dept where department_name in ('abc'
, 'xyz', 'def') ;