.sqlスクリプトを使用して、SQLスクリプトから複数行のパターンを検索する必要がありますawk
。
サンプルスクリプト -
select * from dept where department_name in ('abc'
, 'xyz', 'def') ;
department_name in
上記の例では、閉じ括弧のパターンを検索する必要がありますが、その)
パターンがスクリプトに複数回表示されることがあります。
上記の例では、「IN」句の値は複数の行にまたがっています。
答え1
SQLが;
ステートメント区切り文字として使用されているとします。
$ 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;
その後、通常どおりに;
レコード区切り文字を使用できます。awk
$ awk 'BEGIN { RS=";" } /department_name in ([^)]+)/ { print $0 ";" }' statements.sql
select * from dept where department_name in ('abc'
, 'xyz', 'def') ;
このパターンは/department_name in ([^)]+)/
文字列department_name in (
と1つ以上の非文字)
(改行を含む)、)
。
このステートメントは、レコードが削除されたため、レコードの末尾に追加print
されます(すべてのレコード区切り文字が削除されます)。;
;
awk
;
ファイルの前の内容の後に空白行があるので、空白行が追加されます。以下を使用してフィルタリングできます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') ;
答え2
区切り記号を使用しawk
て記録できますRS
。
$ cat << EOT | awk -v RS="department_name|)" 'NR%2==0'
> select * from dept where department_name in ('abc' ,
> 'xyz',
> 'def') ;
> EOT
in ('abc' ,
'xyz',
'def'
RS
レコードを複数行で構成できるようにまたはdepartment_name
に設定します。)
2つの同じラベルがない場合、2つのNR%2=0
異なるラベル間のすべての内容が印刷されます。
答え3
これがあなたが探している答えであることを願っています:
grep -oE 'department_name.*\)' file_name
PS awkがこの問題をどのように解決するのかわかりません。