다음과 같이 기존 변수의 일부만 새로운 사용자 입력 변수로 바꾸려고 합니다.
#Current Variable:
gdbName=Test.MY.DOMAIN.COM <--I need to replace the "Test" (This can be any other string not just Test e.g. CDB79 etc.) part only in this variable with new user input variable.
#New user input variable:
read -p "Enter CDB Name : " CDBName
#I tried the following line:
sed -i "s/gdbName=*.MY.DOMAIN.COM/gdbName=$CDBName/" somefile.txt
그러나 이는 전체 변수를 대체합니다.
어떤 제안이 있으십니까?
참고: 파일의 변수를 업데이트하고 있습니다.
답변1
몇 줄이 포함된 파일을 수정하고 싶다고 가정해 보겠습니다.
gdbName=Test.MY.DOMAIN.COM
음, 이것은 다음을 사용하여 수행할 수 있습니다.
sed "s/^\(gdbName\)=Test\./\1=$CDBName./" somefile
또는 보다 일반적이어야 하고 string 을 지정하지 않는 경우 Test
점이 포함되지 않은 모든 문자열(빈 문자열 포함)과 일치시킬 수 있습니다.
sed "s/^\(gdbName\)=[^.]*\./\1=$CDBName./" somefile
이 명령은 줄의 시작 부분(첫 번째 점까지)을 변수 이름( string gdbName
), 등호 및 쉘 변수의 값 으로 바꿉니다 CDBName
.
사용자 입력에는 특수 백슬래시로 인코딩된 문자 시퀀스 또는 가 포함 CDBName
되지 않은 것으로 가정됩니다 .&
/
sed
두 경우 모두 쉘 스크립트는 이름이 지정된 변수를 정의할 필요가 없습니다 gdbName
.
sed
귀하가 명시적으로 일치 항목을 요청하고 교체했기 때문에 도메인 이름의 후행 부분을 제거하려고 시도했습니다 .
답변2
예를 들어, 변수를 통해 새 이름을 동적으로 설정하려면(여기에는 영구 변경 사항만 표시됩니다):
시도가 거의 완료되었습니다.
sed -i "s/gdbName=*.MY.DOMAIN.COM/gdbName=$CDBName/" somefile.txt
sed -i "s/gdbName=.*\.MY\.DOMAIN\.COM/gdbName=$CDBName.MY.DOMAIN.COM/" somefile.txt
정규식의 점은 모든 문자와 일치하지만 점 자체를 포함하므로 대부분의 경우 여기서 점을 마스킹하는 것은 약간 과잉입니다.