SORU
16 ŞUBAT 2011, ÇARŞAMBA


Nasıl Linux kabuk komut dosyasından YAML dosyası ayrıştırma miyim?

Düzenlemek için bir teknik olmayan bir kullanıcı (ne yazık ki bir dosya olmalı) için mümkün olduğunca kolay ve YAML kullanmak istedim yapılandırılmış bir yapılandırma dosyası sunmak istiyorum. Unıx kabuk komut bu ayrıştırma herhangi bir şekilde ancak bulamıyorum.

CEVAP
17 Ocak 2014, Cuma


Burada sed ve awk basit yaml dosyalarını ayrıştırmak için güçlendirir bash-sadece bir çözümleyici:

function parse_yaml {
   local prefix=$2
   local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
   sed -ne "s|^\($s\):|\1|" \
        -e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \
        -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p"  $1 |
   awk -F$fs '{
      indent = length($1)/2;
      vname[indent] = $2;
      for (i in vname) {if (i > indent) {delete vname[i]}}
      if (length($3) > 0) {
         vn=""; for (i=0; i<indent; i  ) {vn=(vn)(vname[i])("_")}
         printf("%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3);
      }
   }'
}

Dosyaları bu tür anlar:

## global definitions
global:
  debug: yes
  verbose: no
  debugging:
    detailed: no
    header: "debugging started"

## output
output:
   file: "yes"

Hangi kullanırken ayrıştırılır:

parse_yaml sample.yml

çıkış:

global_debug="yes"
global_verbose="no"
global_debugging_detailed="no"
global_debugging_header="debugging started"
output_file="yes"

ayrıca gibi yaml dosyaları, ruby semboller içerebilir ruby tarafından oluşturulan anlar:

---
:global:
  :debug: 'yes'
  :verbose: 'no'
  :debugging:
    :detailed: 'no'
    :header: debugging started
  :output: 'yes'

ve çıkış, bir önceki örnekte olduğu gibi aynı olacaktır.

bir komut dosyası içinde Tipik kullanım:

eval $(parse_yaml sample.yml)

parse_yaml ithal ayarları ortak bir önek var, böylece bir önek değişkeni ad çakışması riskini azaltır) kabul eder.

parse_yaml sample.yml "CONF_"

verim:

CONF_global_debug="yes"
CONF_global_verbose="no"
CONF_global_debugging_detailed="no"
CONF_global_debugging_header="debugging started"
CONF_output_file="yes"

Bir dosyada önceki ayarları daha sonra Ayarlar tarafından sevk edilebilir unutmayın

## global definitions
global:
  debug: yes
  verbose: no
  debugging:
    detailed: no
    header: "debugging started"

## output
output:
   debug: $global_debug

Başka bir güzel kullanımı ilk varsayılan bir dosya ayrıştırma için ve daha sonra son ayarları beri çalışan kullanıcı ayarları, ilk olanları geçersiz kılar:

eval $(parse_yaml defaults.yml)
eval $(parse_yaml project.yml)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • El SalvaLobo

    El SalvaLobo

    10 Temmuz 2006
  • Jack Vale Films

    Jack Vale Fi

    8 ŞUBAT 2007
  • RobertDuskin

    RobertDuskin

    12 HAZİRAN 2008