대부분의 구성 관리 소프트웨어 도구에는 파일의 블록을 교체하는 방법이 있습니다.
예:
나는 이러한 큰 도구의 오버헤드 없이 이것을 정확히 원했습니다.
텍스트 파일의 블록을 업데이트하고 유지 관리하는 간단한 도구가 있습니까?
예: 업데이트하고 싶습니다./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
다른 시나리오(예: 시작 댓글은 있지만 종료 댓글이 없거나 여러 블록...)를 처리하는 것이 점점 더 어려워지고 있습니다.