根据模式注释掉文件中的行

根据模式注释掉文件中的行

文件:/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 函数”开头的行
逐行循环,以最后一行结束,具有模式“LANGUAGE C”

答案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/language/5to6-nutshell#if_elsif_else_unless
https://raku.org

相关内容