안녕하세요, 저는 이 분야가 처음이므로 조금만 기다려주세요. 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 인식 도구를 사용하면 파일에 안전하게 액세스하고 수정할 수 있을 뿐만 아니라 매우 쉽습니다.
의 일부인 tomlq
JSON 파서 주위에 TOML 파서 래퍼를 사용합니다 .jq
yq
https://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