検索文字列を含む特定のコードブロックをコメントアウトする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から2番目のSIDまですべての行をコメントアウトします。 - 1行

関連情報