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
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)
Nasıl kabuk Unix komut satırında ya da...
Nasıl Bash komut dosyası için burada b...
Nasıl bir metin dosyasının ilk satırı ...
Nasıl R bir komut dosyası komut satırı...
Nasıl kabuk komut dosyası için Yakut k...