0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[sed] 複数行にまたがったSQLクエリをコメントアウトしたい

Last updated at Posted at 2023-06-19

動機

pg_dumpでダンプしたバックアップファイル(=クエリの連続)の中で以下のDDLのクエリをコメントアウトしたい。

  • CREATE SERVER ~
  • CREATE FOREIGN TABLE ~

難しいのは、クエリが改行されて複数行にまたぐことがあること。

やり方

CREATE SERVER ~ をコメントアウト

queries.sql
CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');

CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw 
    OPTIONS (host 'foo', dbname 'foodb', port '5432');

  • $ cat queries.sql | sed -e "/^CREATE SERVER.*;$/ s|^|-- |; /^CREATE SERVER/, /.*;$/ s|^|-- |"
  • $ cat queries.sql | sed -e "/^CREATE SERVER.*;$/ s|^|-- |" | sed -e "/^CREATE SERVER/, /.*;$/ s|^|-- |"

のいずれかにより、

-- CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');

-- CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw 
--     OPTIONS (host 'foo', dbname 'foodb', port '5432');

CREATE FOREIGN TABLE ~ をコメントアウト

queries.sql
CREATE FOREIGN TABLE films (code char(5) NOT NULL, title varchar(40) NOT NULL) SERVER film_server;

CREATE FOREIGN TABLE films (
    code        char(5) NOT NULL,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
)
SERVER film_server;

  • $ cat queries.sql | sed -e "/^CREATE FOREIGN TABLE.*;$/ s|^|-- |; /^CREATE FOREIGN TABLE/, /.*;$/ s|^|-- |"
  • $ cat queries.sql | sed -e "/^CREATE FOREIGN TABLE.*;$/ s|^|-- |" | sed -e "/^CREATE FOREIGN TABLE/, /.*;$/ s|^|-- |"

のいずれかにより、

-- CREATE FOREIGN TABLE films (code char(5) NOT NULL, title varchar(40) NOT NULL) SERVER film_server;

-- CREATE FOREIGN TABLE films (
--     code        char(5) NOT NULL,
--     title       varchar(40) NOT NULL,
--     did         integer NOT NULL,
--     date_prod   date,
--     kind        varchar(10),
--     len         interval hour to minute
-- )
-- SERVER film_server;

これらを一気に行うには、

function sed_exp(){
  echo "/^$1.*;$/ s|^|-- |; /^$1/, /.*;$/ s|^|-- |"
}

cat queries.sql | sed -e "$(sed_exp "CREATE SERVER")" | sed -e "$(sed_exp "CREATE FOREIGN TABLE")"

これにより、

-- CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');

-- CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');

-- CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw 
--     OPTIONS (host 'foo', dbname 'foodb', port '5432');

-- CREATE FOREIGN TABLE films (code char(5) NOT NULL, title varchar(40) NOT NULL) SERVER film_server;

-- CREATE FOREIGN TABLE films (
--     code        char(5) NOT NULL,
--     title       varchar(40) NOT NULL,
--     did         integer NOT NULL,
--     date_prod   date,
--     kind        varchar(10),
--     len         interval hour to minute
-- )
-- SERVER film_server;

限界

以上のやり方だと、以下の事象が発生する。

  • 文末の;の後にコメントがある場合にその続きもコメントアウトされてしまう。
  • 文末の;の後にコメントがあり、その最後の一文字が;の場合にそこまでしかコメントアウトされない。

しかし、pg_dumpにより生成されたファイルに関してこれらは起こらなそうなので一旦よしとする。

参考

のやり方をそのまま使った。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?