2015-01-29 2 views
0

이 파일을 검색했지만 문제가 해결되지 않았습니다.구성 파일을 수정하기위한 쉘 명령 줄

나는

server_ip = xxx.xxx.xxx.xxx

이 파일은 클러스터의 모든 노드에 같은 라인을 가지고 구성 파일을 보유하고 있습니다. server_ip는 때때로 변경해야하는 IP 주소입니다. 이전 ip 주소가 주어지면 server_ip를 새 ip 주소로 변경하는 것이 쉽다는 것을 이해합니다. 하지만 이전 IP 주소를 계속 추적하고 싶지는 않습니다. 난 그냥 server_ip 주소가 새로운 값으로 변경되도록하고 싶다. 여기서 중요한 것은 xxx.xxx.xxx.xxx 부분을 사용하여이 행을 인식하지 않기를 바랍니다. 대신 'server_ip ='을 로케이터로 사용할 수 있으며이 줄을 찾으면 server_ip를 새로운 값으로 설정하기 만하면됩니다.

감사합니다.

+0

'sed' 명령을보십시오. – nacholibre

답변

1

GNU sed에는 -i 옵션이 있습니다. 이 명령은 새로운 문자열과 일치하는 각 문자열을 대체하는 간단한 대체품입니다. 새 주소를 포함하는 환경 변수에 액세스 할 수 있도록 큰 따옴표를 사용합니다. 큰 따옴표 때문에 일치 패턴에서 EOL을 나타내는 $를 이스케이프 처리해야합니다. 그렇지 않으면 쉘은 그 뒤에 변수 이름을 표시하려고 시도합니다.

나는 이것을 테스트하지 않았으므로 아마도 잘못되었을 것이지만 가까이 가야합니다. (OP의 수정 사항을 포함하도록 업데이트 됨)

newIp=1.2.3.4; sed -i bak "s/server_ip=.*\$/server_ip=$newIp/g" configfile 
+0

'sed -i'는 POSIX 표준화 된 옵션이 아니라 GNU 확장입니다. 내부 편집을위한 POSIX 도구는'ex'입니다. BSD'sed -i' 구현체도 있습니다.이 구현체는 GNU와 다소 호환되지 않습니다. –

+0

감사합니다. 그 사실을 인식하지 못했습니다. 답을 수정했습니다. –

+0

BTW, 이것에 대해 신중해야하는 곳 ("this"는 일반적으로 sed 스크립트에서 변수를 대체한다는 것을 의미합니다)은 주입 공격에 개방적이라는 것입니다. 이것은 'newIp'값을 변경할 수있는 공격자입니다. 사용시 추가 sed 명령을 스크립트에 추가하여 파일의 다른 행을 변경하거나'r' 또는'w' sed 명령을 사용하여 시스템의 다른 파일을 읽거나 쓸 수 있습니다. –

0

사용 SED!

echo "server_ip=xxx.xxx.xxx.xxx" > file.txt 
sed 's/server_ip=.*/server_ip=NEW_IP/g' <file.txt> tmpFile 
+0

'고양이 foo | sed'는'

+0

'sed'가 사용되는 것을 보여주는 것은 빠른 방법이었습니다.