我正在嘗試從 PostgreSQL 模式轉儲中捕獲 SQL DDL“CREATE”,如下所示:
SET default_table_access_method = heap;
CREATE TABLE schema_name.table_name (
col1 bigint,
col2 text
);
ALTER TABLE schema_name.table_name OWNER TO user;
CREATE INDEX index ON schema_name.table_name USING btree (col1);
我想要的是:
CREATE TABLE schema_name.table_name (
col1 bigint,
col2 text
);`
為什么grep -Po "(CREATE TABLE)[\S\s]*(;)" dump.sql不作業?
在 PCRE2/CREATE TABLE [\w]*\.[\w]*[\S\s]*(;)/U中正確匹配。
謝謝。
uj5u.com熱心網友回復:
sed 將是更好的工具:
sed -n '/^CREATE TABLE/,/;$/p' file.sql
CREATE TABLE schema_name.table_name (
col1 bigint,
col2 text
);
如果您真的想要一個gnu-grep解決方案,請使用:
grep -zPo "(?m)^CREATE TABLE[^;] ;\R" file.sql
CREATE TABLE schema_name.table_name (
col1 bigint,
col2 text
);
uj5u.com熱心網友回復:
不確定您的正則運算式,但這有效:
grep -Poz "CREATE TABLE[^;]*;" dump.sql
給出:
CREATE TABLE schema_name.table_name (
col1 bigint,
col2 text
);
uj5u.com熱心網友回復:
由于這是標記的perl......這是一個使用我發現的舊但漂亮的模塊的快速腳本SQL::Script來決議 SQL 轉儲:
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;
use SQL::Script; # Install with your favorite CPAN client
# Pass the dump file name as the command-line argument
my $script = SQL::Script->new;
$script->read($ARGV[0]);
foreach my $stmt ($script->statements) {
say "$stmt;" if $stmt =~ /^CREATE TABLE/i;
}
例子:
$ ./dump_tables test.sql
CREATE TABLE schema_name.table_name (
col1 bigint,
col2 text
);
uj5u.com熱心網友回復:
使用 GNU,awk您可以嘗試以下awk程式。
awk -v RS='\nCREATE[^)]*\n\\);' 'RT{gsub(/(^|$)\n/,"",RT);print RT}' Input_file
說明:使用 GNUawk,將RS變數設定為awkto\nCREATE[^)]*\n\\);以僅獲取顯示示例中所需的部分。然后在主程式檢查條件中,如果 RT 不為空,則從中洗掉開始行和結束行并列印它,以便從 sql 的輸出中只獲取需要的部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/405153.html
標籤:
上一篇:Perl:修復包含八進制或十六進制代碼的utf8xml檔案
下一篇:Perl錯誤的UTF-8輸出
