문자열 2, 3 또는 4가 존재하는 경우에만 문자열 1을 바꿉니다.

문자열 2, 3 또는 4가 존재하는 경우에만 문자열 1을 바꿉니다.

기본적으로 저는 오라클 DBA입니다. 기본 데이터베이스에서 대기 데이터베이스로 전환하는 작업이 있으며 tns 연결 항목이 포함된 파일에서 tns 항목(호스트 이름)을 tns에서 tns로 sape-scan수정 해야 합니다.sapi-scantnsnames.oraSAP_PRODGOLD_PRODEVENTS_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)

그게 다야. :)

관련 정보