sed 命令注释掉包含搜索字符串的特定代码块

sed 命令注释掉包含搜索字符串的特定代码块

我有一个listener.oraOracle 文件,其中需要注释掉由搜索字符串指定的行块,例如,

>(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 命令的工作,而是完整的 shell 脚本的工作。

  1. 定义行计数器
  2. 定义 SID 标记
  3. 逐行读取
  4. 标记每个SID位置(将它们放入数组中)
  5. 标记每个模式匹配位置(将它们放入另一个数组中)
  6. 检查数组。如果匹配是在 SID 之间,则注释从第一个 SID 到第二个 SID 的所有行 - 1 行

相关内容