파일의 블록을 교체하는 도구

파일의 블록을 교체하는 도구

대부분의 구성 관리 소프트웨어 도구에는 파일의 블록을 교체하는 방법이 있습니다.

예:

나는 이러한 큰 도구의 오버헤드 없이 이것을 정확히 원했습니다.

텍스트 파일의 블록을 업데이트하고 유지 관리하는 간단한 도구가 있습니까?

예: 업데이트하고 싶습니다./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

다른 시나리오(예: 시작 댓글은 있지만 종료 댓글이 없거나 여러 블록...)를 처리하는 것이 점점 더 어려워지고 있습니다.

관련 정보