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

  • Missouri Star Quilt Company

    Missouri Sta

    18 ŞUBAT 2009
  • NCIX Tech Tips

    NCIX Tech Ti

    2 Ocak 2007
  • pain975

    pain975

    27 NİSAN 2008