기본적으로 저는 오라클 DBA입니다. 기본 데이터베이스에서 대기 데이터베이스로 전환하는 작업이 있으며 tns 연결 항목이 포함된 파일에서 tns 항목(호스트 이름)을 tns에서 tns로 sape-scan
수정 해야 합니다.sapi-scan
tnsnames.ora
SAP_PROD
GOLD_PROD
EVENTS_SAP
예:
SAP_PROD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = sape-scan.walmart.net)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SAP)
)
)
tns 항목이 SAP_PROD인 것으로 확인되면 sape-scan을 sapi-scan으로 변경해야 합니다.
답변1
또 다른 옵션은 sed를 사용하는 것입니다.
sed -re '/^(SAP_PROD|GOLD_PROD|EVENTS_SAP) =/,/^$/s/HOST = sape-scan/HOST = sapi-scan/' tnsnames.ora
- 정규식 대체를
-r
위해 확장 정규식( ) 열기|
- 다음 인수(인용된 텍스트)를 평가할 표현식으로 처리합니다(
-e
). - 줄 시작 부분에 "SAP_PROD", "GOLD_PROD" 또는 "EVENTS_SAP"로 묶인 줄 사이에 빈 줄이 나타날 때까지 공백과 등호가 이어집니다.
- "HOST=sape-scan" 텍스트를 검색하여 "HOST=sapi-scan" 텍스트로 바꿉니다.
- tnsnames.ora 파일에서
위 버전을 사용하면 다음을 사용하여 변경 사항을 비파괴적으로 테스트할 수 있습니다.
sed ... tnsnames.ora > tnsnames.new
diff tnsnames.ora tnsnames.new
...그리고 무엇이 바뀌었는지 보세요. 많은 sed 구현에서는 -i
플래그를 추가하여 "제자리"를 변경할 수 있습니다.
답변2
첫 번째 열에 텍스트가 있을 때 항목이 시작된다고 가정하면 다음을 사용하여 세 항목을 변경할 수 있습니다.
awk '/^[A-Z]/ { substitute = ($1 ~ /^((SAP|GOLD)_PROD|EVENTS_SAP)$/) }
substitute { sub(/sape-scan/, "sapi-scan") }1' tnsnames.ora >tnsnames.new
awk는 스크립트에 따라 입력 줄의 각 줄을 처리합니다. 즉, 작은따옴표 사이의 텍스트는 파일의 각 줄에 적용되는 작은 프로그램입니다.
substitute
이 스크립트에서는 헤더 행이 정규식과 일치하는지 여부를 나타내는 부울 값으로 변수가 설정됩니다. 부울이 true인 경우 다른 헤더 행이 표시될 때까지 각 행에서 교체를 수행하고 부울이 다시 평가되어 업데이트될 수 있습니다. 각 줄을 개별적으로 1
인쇄합니다.
diff
원본 파일을 수정할 수 있도록 출력이 새 파일에 저장됩니다 . 결과가 만족스러우면 mv
이전 파일을 새 파일 이름으로 바꾸면 됩니다.
답변3
아주 간단한 형제님, sed
다음과 같이 사용하세요
sed -i -e 's/sape-scan/sapi-scan/g' $(grep -R 'SAP_PROD' ./ *ora|cut -d ':' -f1)
그게 다야. :)