我有一个如下所示的文件
SID_LIST_LISTENER_DG =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = DRCDBDB_DGMGRL)
(ORACLE_HOME = /ofa/u1002/18C_DB_HOME)
(SID_NAME = DRCDBDB1)
)
(SID_DESC =
(GLOBAL_DBNAME = DRNONCDB_DGMGRL)
(ORACLE_HOME = /ofa/u1002/18C_DB_HOME)
(SID_NAME = DRNONCDB1)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = DRTESTDB)
(ORACLE_HOME = /ofa/u1002/18C_DB_HOME)
(SID_NAME = DRTESTDB1)
)
(SID_DESC =
(GLOBAL_DBNAME = DRMIGDB)
(ORACLE_HOME = /ofa/u1002/18C_DB_HOME)
(SID_NAME = DRMIGDB1)
)
(SID_DESC =
(GLOBAL_DBNAME = DRNONCDB)
(ORACLE_HOME = /ofa/u1002/18C_DB_HOME)
(SID_NAME = DRNONCDB1)
)
)
我正在使用以下命令在文件中添加以下行。但由于我有两个相同的匹配行,因此在两者上都添加了以下行。
sed -i '/SID_LIST =/a \ \ \ \ (SID_DESC = \n \ \ \ \ \ (GLOBAL_DBNAME = DB11G) \n \ \ \ \ \ (ORACLE_HOME = /ofa/u1002/18C_DB_HOME) \n \ \ \ \ \ (SID_NAME = DB11G1) \n \ \ \ )' /tmp/listener.ora
"SID_LIST_LISTENER = (SID_LIST ="
现在我只需要在行后添加
如何使用 sed 匹配两行
答案1
您可以将第一行与简单的/^...
正则表达式匹配,然后使用括号内的块来检查第二行。
sed '/^SID_LIST_LISTENER =$/{ N ; /\n\s*(SID_LIST =$/ a _line(s) to append _
; }'
N
读取下一行输入,附加到已有的输入行,并且/\n...
仅在连接处匹配。对于所有不匹配,输入仍将不加修改地打印。
当尝试使用 追加行时a\
,将其全部放入脚本文件中可能会更容易:
/^SID_LIST_LISTENER =$/{ N ;
/\n\s*(SID_LIST =$/ a\
(SID_DESC =\
(GLOBAL_DBNAME = DB11G)\
(ORACLE_HOME = /ofa/u1002/18C_DB_HOME)\
(SID_NAME = DB11G1)\
)
; }
并调用它
sed -f addlines.sed
另请注意,如果您的输入包含两个连续的“第一行”,则此例程将不起作用。
SID_LIST_LISTENER =
SID_LIST_LISTENER =
(SID_LIST =
因为第一场比赛会“用完”第二场比赛;但考虑到您输入的结构,我认为这种情况不会发生。