使用 sed 添加行匹配两行

使用 sed 添加行匹配两行

我有一个如下所示的文件

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 =

因为第一场比赛会“用完”第二场比赛;但考虑到您输入的结构,我认为这种情况不会发生。

相关内容