1

文字列 TABLE1 (大文字と小文字を区別) を含むものを除いて、SQL スクリプトのすべての行にコメントを付けたいと思います。理想的には、コメント (「--」で始まる) と空白行は無視する必要がありますが、そうでない場合はそれほど重要ではありません。

例:初期ファイル

CREATE TABLE TEST (TEST_ID VARCHAR(255) NOT NULL, TEST_NAME VARCHAR(255));
CREATE TABLE LICENSE (ID BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY, PRIMARY KEY (ID));

delete from TEST2 where
    ID = 'whatever'
;

delete from TEST3 where
    ENV = 'whatelse'
;

UPDATE TEST1 SET VERSION = '1.0';

最終ファイル

-- CREATE TABLE TEST (TEST_ID VARCHAR(255) NOT NULL, TEST_NAME VARCHAR(255));
-- CREATE TABLE LICENSE (ID BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY, PRIMARY KEY (ID));

-- delete from TEST2 where
--  ID = 'whatever'
-- ;

-- delete from TEST3 where
--  ENV = 'whatelse'
-- ;

UPDATE TEST1 SET VERSION = '1.0';

私が見つけた唯一の解決策は次のとおりです。 1. スクリプトのすべての行をコメントアウトし、文字列 TEST1 に一致する行のコメントを解除します。

    <replaceregexp file="${sql.file}"
        match="(.*)"
        replace="-- \1"
        byline="true"
    />
    <replaceregexp file="${sql.file}"
        match="^-- (.*TEST1)"
        replace="\1"
        byline="true"
    />
  1. 保持したい行のみを含む新しいファイルを作成します。

    <copy file="${sql.file}" tofile="${sql.file.bak}">
      <filterchain>
        <linecontains>
          <contains value="TEST1"/>
        </linecontains>
      </filterchain>
    </copy>
    

私は両方の解決策に満足していません: 解決策 #1. 2 つのタスクを使用し、同じファイルを 2 回更新します。コメントとして保持したい他の行を削​​除します

誰かが正しい答えを持っているなら、私はそれを取ります。

ありがとう、サブリナ

4

1 に答える 1

1

1つの解決策は

<replaceregexp file="${sql.file}"
     match="(^(?!$))(?!.*TEST1)"
     replace="-- \1"
     byline="true" />

これの鍵?!は、「否定先読みアサーション」です。これは、 の後の括弧内の文字列が見つからない場合に一致が見つかったことを示して?!ます

パターンの説明は次のとおりです。

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    ^                        the beginning of the string
--------------------------------------------------------------------------------
    (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
      $                        before an optional \n, and the end of
                               the string
--------------------------------------------------------------------------------
    )                        end of look-ahead
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    TEST1                    'TEST1'
--------------------------------------------------------------------------------
  )                        end of look-ahead
于 2013-11-15T00:14:05.210 に答える