我有一个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 命令的工作,而是完整的 shell 脚本的工作。
- 定义行计数器
- 定义 SID 标记
- 逐行读取
- 标记每个SID位置(将它们放入数组中)
- 标记每个模式匹配位置(将它们放入另一个数组中)
- 检查数组。如果匹配是在 SID 之间,则注释从第一个 SID 到第二个 SID 的所有行 - 1 行