Shell-Script

使用匹配兩行的 sed 添加行

  • November 6, 2019

我有一個像下面這樣的文件

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匹配兩行

您可以使用簡單的正/^...則表達式匹配第一行,然後使用括號塊檢查第二行。

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 =

因為第一場比賽將“用完”第二場比賽;但考慮到您輸入的結構,我認為這不會發生。

引用自:https://unix.stackexchange.com/questions/550657