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하지만 우리가 원하는 것은 koko이전에 존재하지 않았던 경우에만 추가하는 것 입니다 master.

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

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 경로 중간에 나타나거나 나타나지 않더라도 실제로는 URI의 서버 이름 부분만 수정하고 master다른 곳에서는 문자열을 수정하지 않는 좀 더 구체적인 것을 사용할 수 있습니다.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이전 의 개수에 관계없이 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

관련 정보