YAML 파일의 다음 섹션을 바꾸려고 합니다.
ssl:
enabled: false
읽다
ssl:
enabled: true
나는 이것을 시도했지만 실패했습니다.sed -i s/ssl:\n enabled: false/ssl:\n enabled: true/g
답변1
범위를 사용할 수 있습니다 sed
.
sed '/^ *ssl:/,/^ *[^:]*:/s/enabled: false/enabled: true/' file
범위 경계는 /^ *ssl:/
(ssl 섹션의 시작) 및 /^ *[^:]*:/
(기타 섹션)입니다.
이는 s
일반적인 교체 명령입니다.
답변2
YAML을 지원하는 도구를 사용하세요. 예를 들어 Perl에서는 다음을 수행할 수 있습니다.
perl -MYAML=LoadFile,DumpFile -we '
$y = LoadFile("file");
$y->{ssl}{enabled} = "true" if $y->{ssl}{enabled} eq "false";
DumpFile("file.new", $y);'
답변3
죄송합니다. @choroba의 의견에 동의하며 yaml을 구문 분석하고 작성할 수 있는 도구를 사용하라고 말씀드립니다. sed 구문 분석은 올바른 방법이 아닙니다. 여러 개의 연속된 끝 줄과 다른 들여쓰기가 있을 수 있습니다. 정규식은 너무 복잡해질 수 있으며 결국 자체 Yaml 파서를 작성하게 됩니다.
Bash 쉘에서 사용할 수 있는 Ruby 솔루션은 다음과 같습니다.
echo "ssl:
enabled: false
" | bundle exec ruby -e "require 'psych';
c = Psych.load(STDIN.read); c['ssl']['enabled'] = true;
puts c.to_yaml" > updated_dest.yml
두 개의 인수가 있는 쉘 스크립트를 원하는 경우에도 쉽습니다.
#!/usr/bin/env ruby
require 'psych'
c = Psych.load_file(ARGV.shift)
c['ssl']['enabled'] = true
File.open(ARGV.shift, 'wb+') {|f| f.write(c.to_yaml)}