sed를 사용하여 여러 줄 바꾸기

sed를 사용하여 여러 줄 바꾸기

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)}

관련 정보