検索文字列を含む特定のコードブロックをコメントアウトする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

おすすめ記事