ファイル:/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