![파일의 블록을 교체하는 도구](https://rvso.com/image/97243/%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%B8%94%EB%A1%9D%EC%9D%84%20%EA%B5%90%EC%B2%B4%ED%95%98%EB%8A%94%20%EB%8F%84%EA%B5%AC.png)
대부분의 구성 관리 소프트웨어 도구에는 파일의 블록을 교체하는 방법이 있습니다.
예:
나는 정확히 이것을 원하지만 이러한 큰 도구의 오버헤드는 없습니다.
텍스트 파일의 블록을 유지 관리하는 간단한 도구가 있습니까?
예: 업데이트하고 싶습니다./etc/some-server/some-server.conf
다음과 같은 블록을 삽입/업데이트하고 싶습니다.
## start my-block
key1=value1
key2=value2
## end my-block
나는 awk 또는 Python의 몇 줄로 이 작업을 수행할 수 있다는 것을 알고 있지만 바로 사용할 수 있는 도구를 검색합니다.
답변1
Sed는 텍스트 교체에 적합합니다. 나는 이것을 테스트하기 위해 bash 쉘 근처에 있지 않지만 대략적으로 말하면 문제에 대한 제한된 지식을 고려할 때 필요하거나 쉽게 사용할 수 있는 명령은 다음과 같습니다.
sed '/in lines containing this/cut this/paste this/' in.file >out.file
또한 대체 's/this/that/' 형식을 사용하며 일련의 파이프 명령에 이상적입니다.
답변2
이것이 얼마나 간단한지는 도구가 비명목적인 조건에서 어떻게 작동해야 하는지에 따라 달라집니다. 파일에 항상 특수 주석이 있는 블록이 하나만 있는 경우 awk를 사용하면 충분히 쉽습니다. 예를 들어,
awk '
/^## end my-block$/ {skip=0}
!skip {print}
/^## start my-block$/ {skip=1; system("cat new-block-content") || exit(1)}
' </etc/some-server/some-server.conf >/etc/some-server/some-server.conf.new &&
mv /etc/some-server/some-server.conf.new /etc/some-server/some-server.conf
블록이 아직 없는 경우 끝에 블록을 추가하려는 경우에도 어렵지 않습니다.
awk '
/^## end my-block$/ {skip=0}
!skip {print}
/^## start my-block$/ {skip=1; system("cat new-block-content") || exit(1)}
END {print "## start my-block"; system("cat new-block-content") || exit(1); print "## end my-block"}
' </etc/some-server/some-server.conf >/etc/some-server/some-server.conf.new &&
mv /etc/some-server/some-server.conf.new /etc/some-server/some-server.conf
다른 시나리오(예: 시작 주석은 있지만 종료 주석은 없음, 여러 블록 등)에 대처하는 것이 점점 더 어려워집니다.