sed + 존재하지 않는 경우에만 문자열 앞에 단어를 추가합니다.

sed + 존재하지 않는 경우에만 문자열 앞에 단어를 추가합니다.

Linux의 파일에는 다음 줄이 있습니다.

discovery.uri=http://master.navada.com:8800

kokobefore 라는 단어를 추가하고 싶으 master므로 다음과 같이 합니다.

sed –i 's/master/kokomaster/' file

이는 다음을 제공합니다:

discovery.uri=http://kokomaster.navada.com:8800

그러나 우리가 원하는 것은 이전에 존재하지 않는 koko경우에만 추가하는 것입니다 .kokomaster

예를 들어, 다음에 우리가 실행할 때

sed –i 's/master/kokomaster/' file

라인은 다음과 같습니다

discovery.uri=http://kokokokomaster.navada.com:8800

답변1

sed -i '/kokomaster/!s/master/koko&/' file

먼저 해당 줄에 문자열이 kokomaster있는지 테스트하고, 없으면 대체를 수행합니다. 이것은 "그러나 우리가 원하는 것은 단어 앞에 존재하지 않는 koko경우에만 단어를 추가하는 것입니다 " 를 거의 문자 그대로 번역한 것입니다 .kokomastersed

&대체의 대체 부분에 있는 는 패턴 부분(예: master)과 일치하는 텍스트로 대체됩니다.


주석(아래 참조)을 읽은 후 URI 경로에서 발생했거나 발생하지 않았 master더라도 실제로는 URI의 서버 이름 부분만 수정하고 다른 곳에서는 문자열을 수정하지 않는 보다 구체적인 내용을 사용할 수 있습니다 .kokomaster

sed -i 's,^\(discovery\.uri=http://\)\(master\),\1koko\2,' file

정확하고 정확한 일치까지 가고 싶을 수도 있습니다.가득한가상의 실수를 피하기 위해 교체하고 싶은 라인은 다음과 같습니다.

sed -i 's,^\(discovery\.uri=http://\)\(master\.navada\.com:8800\)$,\1koko\2,' file

구성 파일이 JSON 또는 기타 잘 알려진 형식으로 작성된 경우sed전혀 사용하지 않음, 또는 jq해당 형식의 파일을 처리하기 위해 특별히 작성된 다른 적절한 도구입니다.

답변2

사용

sed 's/\(koko\)*master/kokomaster/'

따라서 master이전의 s는 원하는 만큼 koko대체됩니다.

답변3

이 문제를 피하기 위해 조금 더 교체할 수 있습니다.

sed -i sX/masterX/kokomasterX file

이는 "/master"를 대체하므로 다음에 실행할 때 "/kokomaster"가 일치하지 않기 때문에 아무것도 대체되지 않습니다.

답변4

나는 동일한 작업을 수행하기 위해 아래 awk 명령을 사용했습니다.

명령

awk '$0 !~/kokomaster/{gsub("master","kokomaster",$0)}1'  filename >file_tmp && mv file_tmp filename

산출

discovery.uri=http://kokomaster.navada.com:8800
discovery.uri=http://kokomaster.navada.com:8800

관련 정보