Linux의 파일에는 다음 줄이 있습니다.
discovery.uri=http://master.navada.com:8800
koko
before라는 단어를 추가하고 싶기 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
만 추가하는 것입니다"를 거의 문자 그대로 번역한 것입니다.koko
master
sed
교체의 교체 부분은 &
패턴 부분(예: )과 일치하는 텍스트로 교체됩니다 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