文件:/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