パターンに基づいてファイルの行をコメントアウトします。

パターンに基づいてファイルの行をコメントアウトします。

ファイル:/home/jian/Desktop/pg_sources/main/postgres/src/test/regress/sql/test_setup.sql

246: --
247: -- Create some C functions that will be used by various tests.
248: --
249: 
250: CREATE FUNCTION binary_coercible(oid, oid)
251:     RETURNS bool
252:     AS :'regresslib', 'binary_coercible'
253:     LANGUAGE C STRICT STABLE PARALLEL SAFE;
254: 
255: CREATE FUNCTION ttdummy ()
256:     RETURNS trigger
257:     AS :'regresslib'
258:     LANGUAGE C;
259: 
260: CREATE FUNCTION get_columns_length(oid[])
261:     RETURNS int
262:     AS :'regresslib'
263:     LANGUAGE C STRICT STABLE PARALLEL SAFE;

これは決して変わらないと思います。

現在私が使用している

sed -i '250,263 s/^/--/' /home/jian/Desktop/pg_sources/main/postgres/src/test/regress/sql/test_setup.sql

ss関数をコメントアウトしますが、これは安全ではありません。新しい行を前に簡単に追加できます。
だから私はこの行をコメントアウトする方法を見つけようとしています。

パターンは次のとおりです。
「C function」パターンで始まる行を
コメントアウトします。 「LANGUAGE C」パターンを使用して、最後の行で終わる1行ずつ繰り返します。

答え1

awkを使用してください。

$ awk '
    /C functions/ { beg=NR }
    /LANGUAGE C/  { end=NR }
    beg { a[NR]=$0; next }
    { print }
    END {
        for ( i=beg; i<=NR; i++ ) {
            print ( (i>end) || (a[i] ~ /^--/) ? "" : "--" ) a[i]
        }
    }
' test_setup.sql
--
-- Create some C functions that will be used by various tests.
--
--
--CREATE FUNCTION binary_coercible(oid, oid)
--    RETURNS bool
--    AS :'regresslib', 'binary_coercible'
--    LANGUAGE C STRICT STABLE PARALLEL SAFE;
--
--CREATE FUNCTION ttdummy ()
--    RETURNS trigger
--    AS :'regresslib'
--    LANGUAGE C;
--
--CREATE FUNCTION get_columns_length(oid[])
--    RETURNS int
--    AS :'regresslib'
--    LANGUAGE C STRICT STABLE PARALLEL SAFE;

答え2

最後のクローズタグを見つけることは通常、入力を反転してから範囲を検索することによって達成できます/end-match/,/start-match/。これにより、end-matchそれらの間の他のすべてのパターンが含まれます。

例えば

 tac test_setup.sql | 
    sed '/LANGUAGE C/,/C function/s/^/--/;s/^----/--/' | 
    tac

またはawk

tac test_setup.sql | 
   awk '/LANGUAGE C/,/C function/{ if ($0!~/^--/) {sub(/^/,"--",$0)}}1' | 
   tac

あるいは、@EdMortonが提案したように、もっと簡単です。

tac test_setup.sql | 
   awk '/LANGUAGE C/,/C function/{sub(/^(--)?/,"--")}1' |
   tac

答え3

使用幸せ(以前のPerl_6)

~$ raku -ne 'if /^CREATE \s FUNCTION /fff/^ \s+ LANGUAGE/ { put "-- " ~ $_ } else { put $_ };'  file

このRakuの回答は、各CREATE FUNCTION段落に個別に注釈を付けました。 Rakuの/…/fff/…/「トリガー」演算子を使用します。

入力例:

CREATE FUNCTION binary_coercible(oid, oid)
    RETURNS bool
    AS :'regresslib', 'binary_coercible'
    LANGUAGE C STRICT STABLE PARALLEL SAFE;

CREATE FUNCTION ttdummy ()
    RETURNS trigger
    AS :'regresslib'
    LANGUAGE C;

CREATE FUNCTION get_columns_length(oid[])
    RETURNS int
    AS :'regresslib'
    LANGUAGE C STRICT STABLE PARALLEL SAFE;

出力例:

-- CREATE FUNCTION binary_coercible(oid, oid)
--     RETURNS bool
--     AS :'regresslib', 'binary_coercible'
--     LANGUAGE C STRICT STABLE PARALLEL SAFE;

-- CREATE FUNCTION ttdummy ()
--     RETURNS trigger
--     AS :'regresslib'
--     LANGUAGE C;

-- CREATE FUNCTION get_columns_length(oid[])
--     RETURNS int
--     AS :'regresslib'
--     LANGUAGE C STRICT STABLE PARALLEL SAFE;

https://docs.raku.org/routine/fff
https://docs.raku.org/言語/5to6-nutshell#if_elsif_else_unless
https://raku.org

関連情報