검색 문자열이 포함된 특정 코드 블록을 주석 처리하는 sed 명령

검색 문자열이 포함된 특정 코드 블록을 주석 처리하는 sed 명령

listener.ora검색 문자열로 지정된 행 블록을 주석 처리해야 하는 Oracle 파일이 있습니다 . 예를 들어,

>(DESCRIPTION=
>>(ADDRESS_LIST=
>>>(ADDRESS=(PROTOCOL=tcp)(HOST=sale-server)(PORT=1521))
>>>(ADDRESS=(PROTOCOL=ipc)(KEY=extproc))))
>SID_LIST_LISTENER=
>>(SID_LIST=
>>>(SID_DESC=
>>>>(GLOBAL_DBNAME=sales)
>>>>(ORACLE_HOME=/oracle9i)
>>>>(SID_NAME=ales)
>>>>(PROGRAM=extproc))
>>>(SID_DESC=
>>>>(SID_NAME=plsextproc)
>>>>(ORACLE_HOME=/oracle9i)
>>>>(PROGRAM=extproc)))

sales위 파일에서 (데이터베이스 이름) 을 검색 하고 다음 SID_DESC블록까지 해당 문자열을 포함하는 전체 블록을 주석 처리해야 합니다. 예를 들어 원하는 출력은 다음과 같습니다.

>(DESCRIPTION=  
>>(ADDRESS_LIST=  
>>>(ADDRESS=(PROTOCOL=tcp)(HOST=sale-server)(PORT=1521))  
>>>(ADDRESS=(PROTOCOL=ipc)(KEY=extproc))))  
>SID_LIST_LISTENER=  
>>(SID_LIST=  
>>>#(SID_DESC=  
>>>>#(GLOBAL_DBNAME=sales)  
>>>>#(ORACLE_HOME=/oracle9i)  
>>>>#(SID_NAME=ales)  
>>>>#(PROGRAM=extproc))  
>>>(SID_DESC=  
>>>>(SID_NAME=plsextproc)  
>>>>(ORACLE_HOME=/oracle9i)  
>>>>(PROGRAM=extproc)))

답변1

이것은 상당히 간단한 작업이다sed

sed '
    /SID_DESC/{
        /\n/{
            P
            D
            }
        :1
        N
        /PROGRAM/!b1
        /sales/s/[^\n]*\n/#&/g
        }
    ' listener.ora

답변2

제가 보기에는 이것은 단일 sed 명령의 작업이 아니라 완전한 쉘 스크립트의 작업인 것 같습니다.

  1. 행 카운터 정의
  2. SID 태그 정의
  3. 한 줄씩 읽기
  4. 각 SID 위치를 표시합니다(배열에 넣습니다).
  5. 각 패턴 일치 위치를 표시합니다(다른 배열에 넣습니다).
  6. 배열을 확인하십시오. SID 간에 일치하는 경우 첫 번째 SID부터 두 번째 SID까지 모든 줄을 주석 처리합니다. - 1줄

관련 정보