
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 경로에서 발생했거나 발생하지 않았 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