패턴을 기반으로 파일의 행을 주석 처리합니다.

패턴을 기반으로 파일의 행을 주석 처리합니다.

파일:/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

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

관련 정보