.ini 파일의 중복 필드 바꾸기

.ini 파일의 중복 필드 바꾸기

안녕하세요, 저는 이 분야가 처음이므로 조금만 기다려주세요. cl을 통해 편집하려는 구성 파일 .ini가 있고 해당 설정 값을 간단히 바꿀 수 있는 스크립트를 작성하려고 합니다. 예를 들어 false를 true로 변경합니다.

[logs] 
enabled = false 

[smtp] 
enabled = false 

[system] 
enabled = false 

sed 또는 awk(또는 다른 도구)를 사용하여 smtp의 활성화를 true로 설정하고 출력을 쉘 자체에 쓰지 않고 파일을 저장하는 방법

편집: 이것을 사용해 보았지만 sed -i 's/[smtp]\nenabled = false/[smtp]\nenabled = true/' file.ini나에게는 효과가 없습니다

답변1

INI 파일은 실제로 올바른 형식의 TOML 파일입니다. TOML(Tom's Obvious, Minimal Language)은 구성 파일에 사용되는 구조화된 문서 형식입니다. 구조화된 문서 형식인 행 기반 도구는 sed실제로 구문 분석에 적합하지 않습니다. 부분적으로는 데이터가 여러 줄(TOML이 "테이블 배열"을 지원함)일 수 있고 부분적으로는 데이터가 인코딩될 수 있기 때문입니다.

TOML 인식 도구를 사용하면 파일에 안전하게 액세스하고 수정할 수 있을 뿐만 아니라 매우 쉽습니다.

의 일부인 tomlqJSON 파서 주위에 TOML 파서 래퍼를 사용합니다 .jqyqhttps://kislyuk.github.io/yq/

tomlq -t '.smtp.enabled |= true' file.ini

그러면 TOML 파일을 읽고 smtp섹션의 키를 새 값으로 업데이트합니다.enabled

귀하의 질문에 데이터가 주어지면 출력은 다음과 같습니다.

[logs]
enabled = false

[smtp]
enabled = true

[system]
enabled = false

tomlq이 도구는 또는 옵션을 사용하여 "제자리"에서 변경할 수도 있습니다 .-i--in-place

답변2

이것은 아마도 모든 Unix 시스템의 모든 쉘에서 awk를 사용하여 원하는 것일 것입니다.

$ awk '/]/{tag=$1} (tag=="[smtp]") && ($1=="enabled"){$3="true"} 1' file
[logs]
enabled = false

[smtp]
enabled = true

[system]
enabled = false

아니면:

$ awk 'BEGIN{RS="";ORS="\n\n";FS=OFS="\n"} $1=="[smtp]"{$2="enabled = true"} 1' file
[logs]
enabled = false

[smtp]
enabled = true

[system]
enabled = false

또는 다양한 다른 것들... 정답은 실제로 지금까지 예제에 표시된 것 외에 입력 파일에 포함된 내용에 따라 전적으로 달라집니다.

답변3

주문하다:

sed -i '/smtp/{n;s/false/true/g}' file

산출

[logs]
enabled = false

[smtp]
enabled = true

[system]
enabled = false

관련 정보