아래와 같은 파일이 있습니다
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 =
첫 번째 일치는 두 번째 일치를 "소진"하기 때문에 입력 구조를 고려하면 그런 일이 발생하지 않을 것 같습니다.