以下のファイルがあります
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)
)
)
次のコマンドを使用して、ファイルに次の行を追加しています。しかし、2つの同じ一致行があるので、両方の行に次の行を追加しました。
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を使用して2行を一致させる方法
答え1
最初の行を単純な/^...
正規表現と一致させてから、角かっこブロックを使用して2行目を確認できます。
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
また、入力に2つの連続した「最初の行」が含まれている場合、このルーチンは機能しません。
SID_LIST_LISTENER =
SID_LIST_LISTENER =
(SID_LIST =
最初の一致は2番目の一致を「使い果たす」ため、入力構造を考慮するとそのようなことは起こりません。