আমি কীভাবে একটি লিনাক্স শেল স্ক্রিপ্ট থেকে একটি ওয়াইএএমএল ফাইলকে পার্স করতে পারি?


192

আমি একটি কাঠামোগত কনফিগারেশন ফাইল সরবরাহ করতে চাই যা একটি অ প্রযুক্তিগত ব্যবহারকারীর পক্ষে সম্পাদনা করা যতটা সম্ভব সহজ (দুর্ভাগ্যক্রমে এটি একটি ফাইল হতে হবে) এবং তাই আমি ওয়াইএএমএল ব্যবহার করতে চেয়েছিলাম। তবে ইউনিক্স শেল স্ক্রিপ্ট থেকে এটি পার্স করার কোনও উপায় আমি খুঁজে পাচ্ছি না।


আপনার প্রশ্নটি সরাসরি নয়, তবে আপনার শেল লিখনটি বিশেষত বিভিন্ন নোডের দূরবর্তী পরিচালনার সাথে সম্পর্কিত (এবং একটি ইয়ামাল তালিকা) সম্পর্কিত হতে পারে
আপনি

9
yqশেলের মধ্যে ইয়ামল ফাইলগুলি পড়ার / লেখার চেষ্টা করুন । প্রকল্প পাতা এখানে: mikefarah.github.io/yq আপনার সাথে টুল ইনস্টল করতে পারেন brew, aptবা বাইনারি ডাউনলোড করুন। একটি মান পড়া এত সহজyq r some.yaml key.value
vdimitrov

@ টেনারব জেএসন! = ইএমএল /
ওয়াইএএমএল

পাকুজেঞ্জির গিথব আমি খুব ঘনিষ্ঠভাবে সম্পর্কিত ফাংশনগুলি পেয়েছি যার মধ্যে সেরা (আমার জন্য) ছিল যাপ্পেরদের
গিথুতে

উত্তর:


56

আমার ব্যবহারের ক্ষেত্রে এই মূল পোস্টটি যা জিজ্ঞাসা করেছিল ঠিক তার মতো হতে পারে বা নাও হতে পারে তবে এটি অবশ্যই একই রকম।

আমাকে ব্যাশ ভেরিয়েবল হিসাবে কিছু YAML টানতে হবে। ওয়াইএএমএল কখনও এক স্তরের বেশি হবে না।

YAML দেখতে তেমন দেখাচ্ছে:

KEY:                value
ANOTHER_KEY:        another_value
OH_MY_SO_MANY_KEYS: yet_another_value
LAST_KEY:           last_value

আউটপুট যেমন একটি ডিস:

KEY="value"
ANOTHER_KEY="another_value"
OH_MY_SO_MANY_KEYS="yet_another_value"
LAST_KEY="last_value"

আমি এই লাইন দিয়ে আউটপুট অর্জন করেছি:

sed -e 's/:[^:\/\/]/="/g;s/$/"/g;s/ *=/=/g' file.yaml > file.sh
  • s/:[^:\/\/]/="/g(ইউআরএলগুলির জন্য) উপেক্ষা করার সময় :এটি খুঁজে এবং এর সাথে প্রতিস্থাপন করে="://
  • s/$/"/g"প্রতিটি লাইনের শেষে যুক্ত হয়
  • s/ *=/=/g আগে সমস্ত স্থান সরিয়ে দেয় =

13
আপনি কী পাচ্ছেন তা নিশ্চিত নন, তবে যদি আপনি বোঝাতে চান এটি সমস্ত YAML এর জন্য কাজ করে না, আপনি ঠিক বলেছেন। এজন্য আমি কয়েকটি যোগ্যতার সাথে ওপেন করেছি। আমি আমার ব্যবহারের ক্ষেত্রে কী কাজ করেছে তা কেবল ভাগ করেছি, কারণ এটি সেই সময়ের অন্য কোনও তুলনায় প্রশ্নের উত্তরের উত্তর দেয়। এটি অবশ্যই প্রসারিত হতে পারে।
কার্টিস ব্ল্যাকওয়েল

3
কোড ইঞ্জেকশনের জন্যও কিছুটা উন্মুক্ত, তবে আপনি যেমন বলেছিলেন এক ধাপ এগিয়ে
ওরিয়েটেক্সেক্স ২r

1
স্থানীয়ভাবে ব্যবহারের জন্য আমি কেবল শেল স্ক্রিপ্টগুলি লিখেছি, এটি আমার পক্ষে উদ্বেগের বিষয় নয়। তবে, আপনি কীভাবে এটি সুরক্ষিত করতে এবং / অথবা বিস্তারিত জানাতে চান তা যদি আমি জানি তবে আমি অবশ্যই কৃতজ্ঞ হব।
কার্টিস ব্ল্যাকওয়েল

2
এক-স্তর-গভীর ইয়ামিলের অনেকগুলি রূপ রয়েছে - মানগুলি ইন্ডেন্টেড রেখায় অনুসরণ করে বিভক্ত হতে পারে; মানগুলি শেলটি বিশ্লেষণ করবে না এমন একাধিক উপায়ে উদ্ধৃত করা যেতে পারে; সবকিছু ধনুর্বন্ধনী সঙ্গে এক লাইনে লেখা যেতে পারে: {KEY: 'value', ...}; এবং সম্ভবত অন্যদের। সর্বাধিক গুরুত্বপূর্ণ, যদি আপনি ফলাফলটিকে শেল কোড হিসাবে মূল্যায়ন করতে চান, তবে এটি খুব সুরক্ষিত হবে।
বেনি চেরনিয়াভস্কি-পাসকিন

280

এখানে একটি বাশ-কেবল পার্সার রয়েছে যা সহজ ইয়ামল ফাইলগুলি পার্স করার জন্য সেড এবং অ্যাডকে উপভোগ করে:

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

এটি ফাইলগুলি বোঝে যেমন:

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

## output
output:
   file: "yes"

যা ব্যবহার করে পার্স করা হয়:

parse_yaml sample.yml

আউটপুট হবে:

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

এটি ইয়ামিল ফাইলগুলিও বোঝে, রুবি দ্বারা উত্পাদিত যা রুবি চিহ্নগুলি অন্তর্ভুক্ত করতে পারে, যেমন:

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

এবং পূর্ববর্তী উদাহরণ হিসাবে একই আউটপুট হবে।

স্ক্রিপ্টের মধ্যে সাধারণ ব্যবহারটি হ'ল:

eval $(parse_yaml sample.yml)

parse_yaml একটি উপসর্গ যুক্তি গ্রহণ করে যাতে আমদানি করা সেটিংসে একটি সাধারণ উপসর্গ থাকে (যা নামস্থান সংঘর্ষের ঝুঁকি হ্রাস করবে)।

parse_yaml sample.yml "CONF_"

উৎপাদনের:

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

নোট করুন যে কোনও ফাইলে পূর্ববর্তী সেটিংস পরবর্তী সেটিংস দ্বারা উল্লেখ করা যেতে পারে:

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

## output
output:
   debug: $global_debug

আর একটি দুর্দান্ত ব্যবহার হ'ল প্রথমে একটি ডিফল্ট ফাইল এবং তারপরে ব্যবহারকারীর সেটিংস পার্স করা, যেহেতু পরের সেটিংসটি প্রথমে ওভাররাইড করে সেহেতু কাজ করে:

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

3
কুল স্টেফান! এটি যদি ইয়ামল -স্বরলিপিটিকে দেশীয় বাশ অ্যারেতে রূপান্তর করতে পারে তবে অবাক করা হবে!
কুইকশিফ্টিন

3
আপনি যদি স্ক্রিপ্ট স্ক্রিপ্টে প্রিন্টফ লাইন পরিবর্তন করেন তবে এটি করা বেশ সহজ হওয়া উচিত। নোট করুন যদিও ব্যাশের বহুমাত্রিক এসোসিয়েটিভ অ্যারেগুলির জন্য সমর্থন নেই তাই আপনি মান হিসাবে একটি অ্যারে + একক কী দিয়ে শেষ করুন। হুম, সম্ভবত এটি
গিথুব এ

5
এটি 2 স্পেসের স্ট্যান্ডার্ড yML ইন্ডেন্টেশন আশা করে। আপনি যদি 4 টি স্পেস ব্যবহার করে থাকেন তবে ভেরিয়েবলগুলি ডিলিমিটার হিসাবে দুটি আন্ডারস্কোর পাবেন, যেমন global__debugপরিবর্তে global_debug
k0pernikus

3
হাই ভাইব - যদিও আমি নিশ্চিত যে আপনি সঠিক যে অনেক পাঠক শেল থেকে প্রকৃত ওয়াইএএমএল ফাইলগুলি পার্স করতে চান, তবে এটির ফলাফল কী হবে তা পুরোপুরি পরিষ্কার নয় (কমপক্ষে আমার কাছে)। এই স্ক্রিপ্টটির সাহায্যে আমি সমস্যাটি নিয়ে একটি ছুরিকাঘাত করেছি এবং একটি সাবসেটটি সংজ্ঞায়িত করেছি যাতে মান ভেরিয়েবলগুলিতে যুক্তিসঙ্গত ম্যাপিং রয়েছে। আসল ওয়াইএএমএল ফাইলগুলি পার্সিংয়ের বৃহত্তর ইস্যুটিকে সম্বোধন করার ভান করার নিশ্চয়ই কোনও কারণ নেই।
স্টেফান ফরেস্টাম

3
এটি কেবলমাত্র স্ক্রিনে আউটপুট প্রিন্ট করে। আপনি কীভাবে পরে মানগুলি অ্যাক্সেস করবেন?
সাতটু 21

96

আমি shyamlশেল কমান্ড লাইন থেকে YAML প্রশ্নের প্রয়োজনের জন্য পাইথনে লিখেছি ।

সংক্ষিপ্ত বিবরণ:

$ pip install shyaml      ## installation

উদাহরণের ওয়াইএএমএল ফাইল (জটিল বৈশিষ্ট্য সহ):

$ cat <<EOF > test.yaml
name: "MyName !!"
subvalue:
    how-much: 1.1
    things:
        - first
        - second
        - third
    other-things: [a, b, c]
    maintainer: "Valentin Lab"
    description: |
        Multiline description:
        Line 1
        Line 2
EOF

প্রাথমিক জিজ্ঞাসা:

$ cat test.yaml | shyaml get-value subvalue.maintainer
Valentin Lab

জটিল মানগুলি সম্পর্কে আরও জটিল লুপিং কোয়েরি:

$ cat test.yaml | shyaml values-0 | \
  while read -r -d $'\0' value; do
      echo "RECEIVED: '$value'"
  done
RECEIVED: '1.1'
RECEIVED: '- first
- second
- third'
RECEIVED: '2'
RECEIVED: 'Valentin Lab'
RECEIVED: 'Multiline description:
Line 1
Line 2'

কয়েকটি মূল বিষয়:

  • সমস্ত YAML প্রকার এবং সিনট্যাক্সের বিজোড়গুলি সঠিকভাবে পরিচালনা করা হয়, মাল্টলাইন হিসাবে, উদ্ধৃত স্ট্রিংগুলি, ইনলাইন ক্রমগুলি ...
  • \0 প্যাডড আউটপুট কঠিন মাল্টলাইন এন্ট্রি ম্যানিপুলেশন জন্য উপলব্ধ।
  • সাব-মানগুলি নির্বাচন করার জন্য সরল বিন্দুযুক্ত স্বরলিপি (যেমন: subvalue.maintainerএকটি বৈধ কী)।
  • সূচকের মাধ্যমে অ্যাক্সেসটি সিকোয়েন্সগুলিতে সরবরাহ করা হয় (যেমন: অনুক্রমের subvalue.things.-1শেষ উপাদান subvalue.things))
  • ব্যাশ লুপগুলিতে ব্যবহারের জন্য একযোগে সমস্ত ক্রম / স্ট্রাক্ট উপাদানের অ্যাক্সেস।
  • আপনি YAML ফাইলের পুরো সাব-পার্টটিকে আউটপুট করতে পারেন ... YAML, যা শ্যামল দিয়ে আরও ম্যানিপুলেশনগুলির জন্য ভাল মিশ্রিত করে।

আরও নমুনা এবং ডকুমেন্টেশন shyaml github পৃষ্ঠা বা shml পিপিআই পৃষ্ঠাতে উপলব্ধ


1
এটা সত্যিই দারুন! আউটপুটে ফাঁকা থাকা ইয়ামল মানগুলিকে উপেক্ষা করার জন্য যদি কোনও পতাকা থাকে। এখনই এটি "নাল" আউটপুট করে। আমি এনভিডিরের সাথে এটি ডকির-রচনা ফাইলটি এনভডিরের আউটপুট হিসাবে ব্যবহার করছিcat docker-compose.yml | shyaml get-value api.environment | grep -v null | awk -F': ' '{print $2 > ("envdir/" $1)}'
জিমিনিক্রিট

@ জিমিনিক্রিট দয়া করে গিথুব ইস্যু পৃষ্ঠাটি ব্যবহার করুন! আমি অন্তত এই ট্র্যাক রাখা খুশি হবে। ;)
vaab

1
দুর্ভাগ্যক্রমে, shyamlহাস্যকরভাবে ধীর
এখন

42

yq হ'ল লাইটওয়েট এবং পোর্টেবল কমান্ড-লাইন ওয়াইএএমএল প্রসেসর

প্রকল্পটির লক্ষ্য হ'ল যমল ফাইলগুলির জিকিউ বা সেড।

( https://github.com/mikefarah/yq#readme )

উদাহরণ হিসাবে (সরাসরি ডকুমেন্টেশন থেকে চুরি ), এর একটি নমুনা দেওয়া হয়েছে yam

---
bob:
  item1:
    cats: bananas
  item2:
    cats: apples

তারপর

yq r sample.yaml bob.*.cats

আউটপুট হবে

- bananas
- apples

এটিতে কেবল ফিল্টারিংয়ের ক্ষমতা অভাব রয়েছে
অ্যান্টোনিন

formulae.brew.sh/formula/yq 26.679 গত বছরের ইনস্টল হয়েছে।
ডাস্টিনিভেন

1
@ অ্যান্টনিন আমি নিশ্চিত না যে এটি আপনি যা বোঝাতে চেয়েছিলেন তবে মনে হচ্ছে এটির এখন কিছু ফিল্টারিং ক্ষমতা রয়েছে: মাইকফারাহ.এইটবুক.আইও
আইকিউ

32

পাইথনের মতো কিছু অনুবাদককে একটি ছোট স্ক্রিপ্ট পাস করা সম্ভব। রুবি এবং এর ওয়াইএএমএল লাইব্রেরি ব্যবহার করে এটি করার একটি সহজ উপায় নিম্নলিখিত:

$ RUBY_SCRIPT="data = YAML::load(STDIN.read); puts data['a']; puts data['b']"
$ echo -e '---\na: 1234\nb: 4321' | ruby -ryaml -e "$RUBY_SCRIPT"
1234
4321

, dataযামল থেকে মান সহ একটি হ্যাশ (বা অ্যারে)।

বোনাস হিসাবে, এটি জ্যাকিলের সামনের জিনিসটি ঠিক ঠিক পার্স করবে ।

ruby -ryaml -e "puts YAML::load(open(ARGV.first).read)['tags']" example.md

1
এটা ব্যবহারযোগ্য? আপনি রুবি ইন্টারপ্রেটারের প্রতিধ্বনি দ্বারা ইয়েম লাগিয়েছেন। তবে কীভাবে এই পরিবর্তনশীলটিকে ব্যাশ স্ক্রিপ্টের বাকী অংশে ব্যবহার করা উচিত?
Znik

হ্যাঁ, এটি ব্যবহারযোগ্য। RUBY_SCRIPTপরিবর্তনশীল একটি রুবি স্ক্রিপ্ট যা কোনো ফাইল পরিবর্তে (রেখে চালাতে হবে লেখা যেতে পারে ruby -ryaml <rubyscript_filename>)। এটি ইনপুট পাঠ্যকে কিছু আউটপুট পাঠ্যে রূপান্তর করার জন্য যুক্তি ধারণ করে, অভ্যন্তরীণভাবে উপাদানটি dataভেরিয়েবলের মধ্যে সঞ্চয় করে । প্রতিধ্বনিটি একটি ইয়ামল পাঠ্যকে আউটপুট দেয় তবে আপনি cat <yaml_filename>পরিবর্তে কোনও ফাইলের বিষয়বস্তুটি পাইপ করতে পারেন ।
রাফায়েল

আমি দুঃখিত তবে আমি উপরের উদাহরণে এটি দেখতে পাচ্ছি না। প্রথমে পরিবর্তনশীল RUBY_SCRIPT রুবি ইন্টারপ্রেটারের জন্য কোড রাখে। পরবর্তী প্রতিধ্বনি - যেকোন যমল ডেটা সিমুলেট করে, এটি পাইল দ্বারা রুবি ইন্টারপ্রেটারে পুনঃনির্দেশিত হয়। এটি রুবি কোডটিকে ইনলাইন স্ক্রিপ্ট হিসাবে কল করে এবং শেষ পর্যন্ত আউটপুট উদাহরণগুলিতে 'a' এবং 'b' ভেরিয়েবলগুলিতে মুদ্রণ করে। তারপরে তার বিশিষ্ট এক্সিকিউটেবল কোডের জন্য ব্যাশে ভেরিয়েবল লোডিং কোথায়? আমি একটাই কাজ দেখতে পাচ্ছি। অস্থায়ী_ফায়ালে রুবি আউটআউট স্থাপন করা, এতে লাইনগুলি হওয়া উচিত: ভেরিয়েবল = 'মান', এবং এর পরে এটি বাশ দ্বারা লোড করা উচিত '। temporary_file '। তবে এটি কার্যকর নয়, রেজুলেশন নয়।
Znik

1
@ জ্নিক একবার স্ট্যান্ডআউটে কিছু পেয়েছেন, স্টিডিনের সাথে খাওয়ানো কিছু দ্বারা উত্পাদিত, বাকিগুলি বাশ কোডারের হাতে নির্ভর করে (এবং একটি অনুস্মারক হিসাবে, যদি আপনাকে stdoutভেরিয়েবলে খাওয়ানোর প্রয়োজন হয় , আপনার উপর নির্ভর করতে হবে না অস্থায়ী ফাইল! ব্যবহার x=$(...)বা এমনকি read a b c < <(...))। সুতরাং, আপনি যখন ওয়াইএএমএল ফাইলে আনতে চান ঠিক কীভাবে জানেন এবং কীভাবে এই ডেটা অ্যাক্সেস করতে রুবি লাইনগুলি লিখতে হয় তা জানেন তবে এটি একটি বৈধ সমাধান। এমনকি যদি এটি মোটামুটি হয় তবে এটি আইএমএইচও ধারণাটি ধারণার সম্পূর্ণ প্রমাণ। তা সত্ত্বেও এটি সত্য যে এটি আপনাকে একটি পুরো বাশ বিমূর্ততা সরবরাহ করে না।
vaab

হ্যাঁ তাই হয়। আপনি শক্ত। আপনাকে সেই কৌশলটির জন্য ধন্যবাদ একটি ভেরিয়েবল ব্যবহার করা সহজ। কিন্তু অনেক যুদ্ধযোগ্য না। ভেরিয়েবল তালিকা পড়ার কৌশলটি <<(
এক্সট্রা থেকে টু স্টেটআউট

23

আজকাল পাইথন 3 এবং পাইওয়ামএলগুলি সহজেই মিলিত হওয়ার জন্য নির্ভরযোগ্যতা হিসাবে দেওয়া হয়েছে, নিম্নলিখিতগুলি সাহায্য করতে পারে:

yaml() {
    python3 -c "import yaml;print(yaml.safe_load(open('$1'))$2)"
}

VALUE=$(yaml ~/my_yaml_file.yaml "['a_key']")

আমি শ্যামলকে পছন্দ করি তবে সংযোগ বিচ্ছিন্ন সিস্টেমে এটি জীবনরক্ষক। পাইথন 2 এর বিশাল সংখ্যাগরিষ্ঠের সাথেও কাজ করা উচিত, যেমন, আরএইচএল EL
আরএসউ

2
yaml.safe_loadএটি নিরাপদ হিসাবে সম্ভবত ব্যবহার করুন । pyyaml.org/wiki/PYYAML ডকুমেন্টেশন
জর্ডান স্টুয়ার্ট

13

স্টিফান ফেস্টেরামের উত্তরের একটি বর্ধিত সংস্করণ এখানে:

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

এই সংস্করণটি -অভিধান এবং তালিকার জন্য স্বরলিপি এবং সংক্ষিপ্ত স্বরলিপি সমর্থন করে । নিম্নলিখিত ইনপুট:

global:
  input:
    - "main.c"
    - "main.h"
  flags: [ "-O3", "-fpic" ]
  sample_input:
    -  { property1: value, property2: "value2" }
    -  { property1: "value3", property2: 'value 4' }

এই আউটপুট উত্পাদন করে:

global_input_1="main.c"
global_input_2="main.h"
global_flags_1="-O3"
global_flags_2="-fpic"
global_sample_input_1_property1="value"
global_sample_input_1_property2="value2"
global_sample_input_2_property1="value3"
global_sample_input_2_property2="value 4"

যেহেতু আপনি দেখতে পাচ্ছেন যে -প্রতিটি আইটেমের জন্য বিভিন্ন ভেরিয়েবলের নাম পেতে আইটেমগুলি স্বয়ংক্রিয়ভাবে নাম্বার হয়ে যায়। ইন bashকোন বহুমাত্রিক অ্যারে আছে, তাই এই প্রায় এক পথ কাজ হয়। একাধিক স্তর সমর্থিত। @ ব্রাইসবার্গে উল্লিখিত সাদা জায়গাগুলির পিছনে সমস্যা নিয়ে কাজ করার জন্য একক বা দ্বিগুণ উদ্ধৃতিতে মানগুলি আবদ্ধ করা উচিত। তবে, এখনও কিছু সীমাবদ্ধতা রয়েছে: অভিধানগুলিকে এবং তালিকাগুলির সম্প্রসারণের ফলে ভুল ফলাফল হতে পারে যখন মানগুলিতে কমা থাকে। এছাড়াও, আরও জটিল কাঠামো যেমন একাধিক লাইনের বিস্তৃত মানগুলির (যেমন ssh-key) সমর্থিত হয় না (এখনও) সমর্থিত নয়।

কোড সম্পর্কে কয়েকটি শব্দ: প্রথম sedকমান্ড অভিধানের সংক্ষিপ্ত রূপকে { key: value, ...}নিয়মিত প্রসারিত করে এবং আরও সহজ ইয়ামল শৈলীতে রূপান্তর করে। দ্বিতীয় sedকল তালিকাগুলির সংক্ষিপ্ত স্বরলিপিগুলির জন্য একই কাজ করে এবং স্বরলিপি [ entry, ... ]সহ একটি আইটেমযুক্ত তালিকায় রূপান্তর করে -। তৃতীয় sedকলটি হ'ল সেই আসলটি যা সাধারণ অভিধানগুলি পরিচালনা করে, এখন তালিকাগুলি -এবং ইনডেন্টেশনগুলি যোগ করার সাথে সাথে । awkঅংশ (যেমন একটি তালিকা প্রক্রিয়াকরণের যখন) যখন পরিবর্তনশীল নাম খালি প্রতিটি খাঁজ স্তর এবং এটি বৃদ্ধির জন্য একটি সূচক প্রবর্তন করে। কাউন্টারগুলির বর্তমান মান খালি নামের পরিবর্তে ব্যবহৃত হয়। এক স্তরে ওঠার সময়, কাউন্টারগুলি শূন্য হয়।

সম্পাদনা: আমি এর জন্য একটি গিথুব সংগ্রহশালা তৈরি করেছি ।


11

বলা মুশকিল কারণ আপনি আপনার ওয়াইএএমএল ডকুমেন্ট থেকে পার্সারটি কী বের করতে চান তা নির্ভর করে। সহজ ক্ষেত্রেই, আপনি ব্যবহার করতে সক্ষম হতে পারেন grep, cut, awkআরো জটিল পার্সিং আপনি ব্যবহার করতে হবে জন্য ইত্যাদি একটি পূর্ণ প্রস্ফুটিত পাইথন এর মত গ্রন্থাগার যেমন পার্স PyYAML বা YAML :: পার্ল


11

আমি কেবল একটি পার্সার লিখেছিলাম যে আমি ইয়ে বলে! ( ইয়ামল ইয়ামলেস্কে নয়! ) যা ইয়ামএলএসকে , পার্স করে যা YAML এর একটি ছোট উপসেট। সুতরাং, আপনি যদি বাশের জন্য 100% অনুগত YAML পার্সার খুঁজছেন তবে এটি নয়। তবে ওপিকে উদ্ধৃত করার জন্য, আপনি যদি কোনও কাঠামোগত কনফিগারেশন ফাইল চান যা কোনও অ প্রযুক্তিগত ব্যবহারকারীর পক্ষে ওয়াইএএমএল -র মতো সম্পাদনা করা সম্ভব হয় তবে এটি আগ্রহী হতে পারে।

এটি পূর্ববর্তী উত্তরের দ্বারা অনুপ্রাণিত হয়েছে তবে বেসিক ভেরিয়েবলের পরিবর্তে সম্মিলিত অ্যারেগুলি ( হ্যাঁ, এটি বাশ 4.x প্রয়োজন ) লিখেছেন । এটি এমনভাবে হয় যাতে কীগুলি সম্পর্কে পূর্বের জ্ঞান ছাড়াই ডেটা পার্স করার অনুমতি দেয় যাতে ডেটা চালিত কোড লেখা যায়।

কী / মান অ্যারের উপাদানগুলির পাশাপাশি, প্রতিটি অ্যারেতে keysকীগুলির নামের সাথে একটি childrenঅ্যারে থাকে, শিশু অ্যারের নামের একটি অ্যারে থাকে এবং একটি parentকী থাকে যা তার পিতামাতাকে বোঝায়।

এটি ইয়ামলেসকের উদাহরণ:

root_key1: this is value one
root_key2: "this is value two"

drink:
  state: liquid
  coffee:
    best_served: hot
    colour: brown
  orange_juice:
    best_served: cold
    colour: orange

food:
  state: solid
  apple_pie:
    best_served: warm

root_key_3: this is value three

এটি কীভাবে ব্যবহার করবেন তা এখানে একটি উদাহরণ রয়েছে:

#!/bin/bash
# An example showing how to use Yay

. /usr/lib/yay

# helper to get array value at key
value() { eval echo \${$1[$2]}; }

# print a data collection
print_collection() {
  for k in $(value $1 keys)
  do
    echo "$2$k = $(value $1 $k)"
  done

  for c in $(value $1 children)
  do
    echo -e "$2$c\n$2{"
    print_collection $c "  $2"
    echo "$2}"
  done
}

yay example
print_collection example

কোন ফলাফল:

root_key1 = this is value one
root_key2 = this is value two
root_key_3 = this is value three
example_drink
{
  state = liquid
  example_coffee
  {
    best_served = hot
    colour = brown
  }
  example_orange_juice
  {
    best_served = cold
    colour = orange
  }
}
example_food
{
  state = solid
  example_apple_pie
  {
    best_served = warm
  }
}

এবং এখানে আছে পার্সার:

yay_parse() {

   # find input file
   for f in "$1" "$1.yay" "$1.yml"
   do
     [[ -f "$f" ]] && input="$f" && break
   done
   [[ -z "$input" ]] && exit 1

   # use given dataset prefix or imply from file name
   [[ -n "$2" ]] && local prefix="$2" || {
     local prefix=$(basename "$input"); prefix=${prefix%.*}
   }

   echo "declare -g -A $prefix;"

   local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
   sed -n -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" "$input" |
   awk -F$fs '{
      indent       = length($1)/2;
      key          = $2;
      value        = $3;

      # No prefix or parent for the top level (indent zero)
      root_prefix  = "'$prefix'_";
      if (indent ==0 ) {
        prefix = "";          parent_key = "'$prefix'";
      } else {
        prefix = root_prefix; parent_key = keys[indent-1];
      }

      keys[indent] = key;

      # remove keys left behind if prior row was indented more than this row
      for (i in keys) {if (i > indent) {delete keys[i]}}

      if (length(value) > 0) {
         # value
         printf("%s%s[%s]=\"%s\";\n", prefix, parent_key , key, value);
         printf("%s%s[keys]+=\" %s\";\n", prefix, parent_key , key);
      } else {
         # collection
         printf("%s%s[children]+=\" %s%s\";\n", prefix, parent_key , root_prefix, key);
         printf("declare -g -A %s%s;\n", root_prefix, key);
         printf("%s%s[parent]=\"%s%s\";\n", root_prefix, key, prefix, parent_key);
      }
   }'
}

# helper to load yay data file
yay() { eval $(yay_parse "$@"); }

লিঙ্কযুক্ত উত্স ফাইলে কিছু ডকুমেন্টেশন রয়েছে এবং নীচে কোডটি কী করে তার একটি সংক্ষিপ্ত ব্যাখ্যা।

yay_parseফাংশন প্রথম অবস্থান নির্ণয় করে inputফাইল বা 1. পরবর্তী একটি প্রস্থান স্থিতি সহ প্রস্থান করে, এটা ডেটা সেটটি নির্ধারণ করে prefix, হয় স্পষ্টভাবে নির্দিষ্ট ফাইলের নাম থেকে উদ্ভূত।

এটি bashএর স্ট্যান্ডার্ড আউটপুটে বৈধ কমান্ড লিখেছে যা কার্যকর করা হলে ইনপুট ডেটা ফাইলের বিষয়বস্তু উপস্থাপন করে অ্যারেগুলি সংজ্ঞায়িত করে। এর মধ্যে প্রথমটি শীর্ষ স্তরের অ্যারে সংজ্ঞায়িত করে:

echo "declare -g -A $prefix;"

দ্রষ্টব্য যে অ্যারে ঘোষণাগুলি সম্মিলিত ( -A) যা বাশ সংস্করণ 4 এর বৈশিষ্ট্য Dec ঘোষণাগুলিও বৈশ্বিক ( -g) তাই কোনও ফাংশনে এগুলি কার্যকর করা যেতে পারে তবে সহায়িকার মতো বৈশ্বিক সুযোগে উপলভ্য হতে পারে yay:

yay() { eval $(yay_parse "$@"); }

ইনপুট ডেটা শুরুতে প্রক্রিয়া করা হয় sed। এটি এমন লাইনগুলি ড্রপ করে যা এএসসিআইআই ফাইল পৃথককারী চরিত্রের সাথে বৈধ ইয়ামলেস্কে ক্ষেত্রগুলি সীমিত করার আগে এবং মান ক্ষেত্রের আশেপাশের কোনও ডাবল-কোটস সরিয়ে নেওয়ার আগে ইয়ামলেস্ক বিন্যাসের স্পেসিফিকেশনের সাথে মেলে না ।

 local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
 sed -n -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" "$input" |

দুটি এক্সপ্রেশন একই; এগুলির ক্ষেত্রে কেবল আলাদা হয় কারণ প্রথমটি উদ্ধৃত মানগুলি খুঁজে বের করে যেখানে দ্বিতীয়টি অনাবৃত মানগুলি খুঁজে বের করে।

ফাইল পৃথককারী (28 / হেক্স 12 / অকট্যাল 034), কারণ একটি মুদ্রণযোগ্য নয় এমন অক্ষর হিসেবে, এটা ইনপুট ডেটা হতে করার সম্ভাবনা কম ব্যবহার করা হয়।

ফলাফলটি পাইপ করা হয় awkযা একবারে তার ইনপুটকে এক লাইনে প্রসেস করে। এটি প্রতিটি ক্ষেত্রকে একটি ভেরিয়েবলের জন্য নির্ধারণ করতে FS অক্ষর ব্যবহার করে :

indent       = length($1)/2;
key          = $2;
value        = $3;

সমস্ত লাইনের একটি ইনডেন্ট (সম্ভবত শূন্য) এবং একটি কী রয়েছে তবে সেগুলির সমস্তটির কোনও মূল্য নেই। এটি প্রথম ক্ষেত্রের দৈর্ঘ্যকে বিভাজক রেখার জন্য একটি ইনডেন্ট স্তরকে গণনা করে, যার মধ্যে নেতৃস্থানীয় সাদা স্থান দুটি রয়েছে। কোনও ইনডেন্ট ছাড়াই শীর্ষ স্তরের আইটেমগুলি ইনডেন্ট স্তর শূন্যে থাকে।

পরবর্তী, এটি prefixবর্তমান আইটেমটির জন্য কী ব্যবহার করতে হবে তা কার্যকর করে। একটি অ্যারের নাম তৈরি করার জন্য এটি কী কীতে যুক্ত হয়। root_prefixশীর্ষ স্তরের অ্যারের জন্য একটি রয়েছে যা ডেটা সেট নাম এবং আন্ডারস্কোর হিসাবে সংজ্ঞায়িত হয়:

root_prefix  = "'$prefix'_";
if (indent ==0 ) {
  prefix = "";          parent_key = "'$prefix'";
} else {
  prefix = root_prefix; parent_key = keys[indent-1];
}

parent_keyবর্তমান লাইন এর ইন্ডেন্ট স্তরের উপরে ইন্ডেন্ট পর্যায়ে চাবিকাঠি এবং সংগ্রহ যা বর্তমান লাইন অংশ প্রতিনিধিত্ব করে। সংগ্রহের কী / মান জোড়গুলি একটি অ্যারেতে সংরক্ষণ করা হবে যার নাম prefixএবং এর সংক্ষিপ্তকরণ হিসাবে সংজ্ঞায়িত করা হয়েছে parent_key

শীর্ষ স্তরের (ইনডেন্ট স্তর শূন্য) জন্য ডেটা সেট উপসর্গটি প্যারেন্ট কী হিসাবে ব্যবহৃত হয় সুতরাং এর কোনও উপসর্গ নেই (এটি সেট করা আছে "")। অন্যান্য সমস্ত অ্যারে মূল উপসর্গ সহ উপস্থাপিত হয়।

এরপরে, বর্তমান কীটি কী (বিশদ-অভ্যন্তরীণ) অ্যারেতে sertedোকানো হয়েছে। এই অ্যারে পুরো অজস্র অধিবেশন জুড়ে থাকে এবং তাই পূর্ববর্তী লাইনে সন্নিবেশ করা কীগুলি রয়েছে। কীটি অ্যারের সূচক হিসাবে এর ইনডেন্টটি ব্যবহার করে অ্যারেতে প্রবেশ করানো হয়।

keys[indent] = key;

যেহেতু এই অ্যারেটিতে পূর্ববর্তী লাইনগুলি থেকে কী রয়েছে, বর্তমান লাইনের ইনডেন্ট স্তরের চেয়ে কোনও ইনডেন্ট স্তর গ্রেটারের সাথে থাকা কীগুলি সরানো হয়েছে:

 for (i in keys) {if (i > indent) {delete keys[i]}}

এটি মূল লাইন 0 থেকে বর্তমান লাইনে মূল-শৃঙ্খলযুক্ত কী-অ্যারেটি ছেড়ে দেয়। পূর্বের লাইনটি বর্তমান লাইনের চেয়ে আরও গভীর ইনডেন্ট করা অবস্থায় থাকা বাকী কীগুলি সরিয়ে দেয়।

চূড়ান্ত বিভাগটি bashকমান্ডগুলি আউটপুট করে : মান ব্যতীত একটি ইনপুট লাইন একটি নতুন ইনডেন্ট স্তর ( ওয়াইএএমএল পার্লেন্সে একটি সংগ্রহ ) আরম্ভ করে এবং একটি মান সহ একটি ইনপুট লাইন বর্তমান সংগ্রহটিতে একটি কী যুক্ত করে।

সংগ্রহের নামটি বর্তমান লাইনের prefixএবং এর সংক্ষেপণ parent_key

যখন একটি কীটির একটি মান থাকে, তখন সেই মান সহ একটি কীটি বর্তমান সংগ্রহকে এইভাবে বরাদ্দ করা হয়:

printf("%s%s[%s]=\"%s\";\n", prefix, parent_key , key, value);
printf("%s%s[keys]+=\" %s\";\n", prefix, parent_key , key);

প্রথম বিবৃতিটি চাবিটির নাম অনুসারে কোনও এসোসিয়েটিভ অ্যারে উপাদানটির জন্য মূল্য নির্ধারণের জন্য কমান্ডকে আউটপুট দেয় এবং দ্বিতীয়টি সংগ্রহের স্পেস-সীমাবদ্ধ keysতালিকায় কী যুক্ত করতে কমান্ডকে আউটপুট দেয় :

<current_collection>[<key>]="<value>";
<current_collection>[keys]+=" <key>";

যখন কোনও কীটির কোনও মান থাকে না, একটি নতুন সংগ্রহ এইভাবে শুরু হয়:

printf("%s%s[children]+=\" %s%s\";\n", prefix, parent_key , root_prefix, key);
printf("declare -g -A %s%s;\n", root_prefix, key);

প্রথম বিবৃতিটি বর্তমানের সংগ্রহের স্থান-সীমিত childrenতালিকায় নতুন সংগ্রহ যুক্ত করার কমান্ডকে আউটপুট দেয় এবং দ্বিতীয়টি নতুন সংগ্রহের জন্য একটি নতুন সহযোগী অ্যারে ঘোষণা করার আদেশকে আউটপুট করে:

<current_collection>[children]+=" <new_collection>"
declare -g -A <new_collection>;

এর সমস্ত আউটপুট yay_parseবাশ evalবা sourceবিল্ট-ইন কমান্ড দ্বারা বাশ কমান্ড হিসাবে পার্স করা যায় ।


আপনি কি গিটহাবে এই প্রকল্পটি তৈরির কথা বিবেচনা করেছেন? নাকি ইতিমধ্যে?
ড্যানিয়েল

@ ড্যানিয়েল, এটি গিটহাবে রয়েছে তবে নিজস্ব রেপোতে নেই - আপনি এটি এখানে খুঁজে পেতে পারেন । দেখুন examplesএবং usr/libডিরেক্টরি, এই প্রশ্নের আমার উত্তর লিঙ্ক করা হয়। আগ্রহ থাকলে আমি এটিকে তার নিজস্ব রেপোতে ছড়িয়ে দিতে পারি।
স্টারফাই

4
YAY এ কুডোস। প্রথমে, আমি এটি খাঁটি বাশ হিসাবে পুনরায় লিখেছিলাম, কিন্তু তারপরে আমি নিজেকে থামাতে পারিনি এবং একে একে একে অন্যের নামে পদক্ষেপ নিতে পারে না এমন অ্যারে এবং নেস্টেড স্ট্রাকচারের সমর্থন সহ একটি বেসিক পার্সার হিসাবে পুনরায় প্রয়োগ করতে পারি। এটি github.com/binaryphile/y2sরয়েছে
বাইনারি ফিলি

5
perl -ne 'chomp; printf qq/%s="%s"\n/, split(/\s*:\s*/,$_,2)' file.yml > file.sh

শুধুমাত্র ফ্ল্যাট কনফিগারেশনের জন্য ব্যবহারযোগ্য। এটি কাঠামোগত ইয়ামলের জন্য প্রযোজ্য নয়। অন্যটি, কীভাবে অস্থায়ী ফাইল.শ ব্যবহার বন্ধ করবেন?
Znik

5

অন্য বিকল্পটি হ'ল YAML কে JSON এ রূপান্তর করা, তারপরে JSON উপস্থাপনার সাথে যোগাযোগ করতে jq ব্যবহার করুন হয় তা থেকে তথ্য আহরণ করতে বা সম্পাদনা করতে।

আমি একটি সাধারণ বাশ স্ক্রিপ্ট লিখেছি যাতে এই আঠালো রয়েছে - গিটহাবের ওয়াই 2জে প্রকল্প দেখুন


2

আপনার যদি একক মানের প্রয়োজন হয় তবে আপনি এমন একটি সরঞ্জাম করতে পারেন যা আপনার ওয়াইএএমএল ডকুমেন্টটিকে জেএসএনে রূপান্তর করে এবং jqউদাহরণস্বরূপ ফিড করে yq

নমুনার সামগ্রী। আইএমএল:

---
bob:
  item1:
    cats: bananas
  item2:
    cats: apples
  thing:
    cats: oranges

উদাহরণ:

$ yq -r '.bob["thing"]["cats"]' sample.yaml 
oranges

1

আমি জানি এটি খুব নির্দিষ্ট, তবে আমি মনে করি আমার উত্তরটি নির্দিষ্ট ব্যবহারকারীর জন্য সহায়ক হতে পারে।
আপনি যদি নিজের মেশিনে ইনস্টল করে থাকেন nodeএবং npmব্যবহার করতে পারেন js-yaml
প্রথম ইনস্টল করুন:

npm i -g js-yaml
# or locally
npm i js-yaml

তারপরে আপনার বাশ স্ক্রিপ্টে

#!/bin/bash
js-yaml your-yaml-file.yml

এছাড়াও আপনি যদি ব্যবহার করেন তবে jqআপনিও এর মতো কিছু করতে পারেন

#!/bin/bash
json="$(js-yaml your-yaml-file.yml)"
aproperty="$(jq '.apropery' <<< "$json")"
echo "$aproperty"

কারণ js-yamlএকটি ইয়ামল ফাইলকে জসন স্ট্রিংকে আক্ষরিক রূপান্তরিত করে। তারপরে আপনি আপনার ইউনিক্স সিস্টেমে যে কোনও জসন পার্সারের সাহায্যে স্ট্রিংটি ব্যবহার করতে পারেন।


1

আপনার কাছে পাইথন 2 এবং পাইওয়ামএল থাকলে আপনি এই পার্সারটি ব্যবহার করতে পারেন যা আমি লিখেছিলাম parse_yaml.py বলে । এটি করার মতো কিছু পরিষ্কার জিনিস আপনাকে উপসর্গটি বেছে নিতে দেয় (যদি আপনার অনুরূপ ভেরিয়েবলের সাথে একাধিক ফাইল থাকে) এবং ইয়ামল ফাইল থেকে একক মান বাছাই করতে পারে।

উদাহরণস্বরূপ যদি আপনার কাছে এই ইয়ামল ফাইল থাকে:

staging.yaml:

db:
    type: sqllite
    host: 127.0.0.1
    user: dev
    password: password123

prod.yaml:

db:
    type: postgres
    host: 10.0.50.100
    user: postgres
    password: password123

আপনি উভয় বিবাদ ছাড়াই লোড করতে পারেন।

$ eval $(python parse_yaml.py prod.yaml --prefix prod --cap)
$ eval $(python parse_yaml.py staging.yaml --prefix stg --cap)
$ echo $PROD_DB_HOST
10.0.50.100
$ echo $STG_DB_HOST
127.0.0.1

এমনকি চেরি আপনার পছন্দসই মানগুলি বাছাই করে।

$ prod_user=$(python parse_yaml.py prod.yaml --get db_user)
$ prod_port=$(python parse_yaml.py prod.yaml --get db_port --default 5432)
$ echo prod_user
postgres
$ echo prod_port
5432


0

আপনি গ্রান্ট (জাভাস্ক্রিপ্ট টাস্ক রানার) ব্যবহার করেও বিবেচনা করতে পারেন । শেলের সাথে সহজেই সংহত করা যায়। এটি YAML ( grunt.file.readYAML) এবং JSON ( grunt.file.readJSON) ফাইলগুলি সমর্থন করে।

এটি Gruntfile.js(বা Gruntfile.coffee) কোনও টাস্ক তৈরি করে অর্জন করা যেতে পারে , যেমন:

module.exports = function (grunt) {

    grunt.registerTask('foo', ['load_yml']);

    grunt.registerTask('load_yml', function () {
        var data = grunt.file.readYAML('foo.yml');
        Object.keys(data).forEach(function (g) {
          // ... switch (g) { case 'my_key':
        });
    });

};

তারপরে শেল থেকে কেবল চালান grunt foo( grunt --helpউপলভ্য কার্যাদি পরীক্ষা করুন )।

আরও আপনি নিজের টাস্কটি ( ) থেকে পাস করা ইনপুট ভেরিয়েবলগুলি সহ exec:fooকার্যগুলি প্রয়োগ করতে পারেন ( grunt-exec) আপনার foo: { cmd: 'echo bar <%= foo %>' }পছন্দমতো বিন্যাসে আউটপুট প্রিন্ট করতে, তারপরে এটি অন্য কমান্ডে পাইপ করুন।


গ্রান্টের সাথে একই রকম সরঞ্জাম রয়েছে, একে অতিরিক্ত প্লাগইন gulp-yaml সহ গুল্প বলা হয় ।

এর মাধ্যমে ইনস্টল করুন: npm install --save-dev gulp-yaml

নমুনা ব্যবহার:

var yaml = require('gulp-yaml');

gulp.src('./src/*.yml')
  .pipe(yaml())
  .pipe(gulp.dest('./dist/'))

gulp.src('./src/*.yml')
  .pipe(yaml({ space: 2 }))
  .pipe(gulp.dest('./dist/'))

gulp.src('./src/*.yml')
  .pipe(yaml({ safe: true }))
  .pipe(gulp.dest('./dist/'))

ওয়াইএএমএল ফর্ম্যাটটি মোকাবেলা করার জন্য আরও বিকল্পগুলির জন্য , উপলব্ধ প্রকল্পগুলি, গ্রন্থাগারগুলি এবং অন্যান্য সংস্থানগুলির জন্য YAML সাইটটি পরীক্ষা করুন যা আপনাকে সেই ফর্ম্যাটটি বিশ্লেষণ করতে সহায়তা করতে পারে to


অন্যান্য সরঞ্জাম:

  • Jshon

    JSON পার্স করে, পড়ে এবং তৈরি করে


0

আমি জানি আমার উত্তরটি সুনির্দিষ্ট, তবে যদি ইতিমধ্যে কারও কাছে পিএইচপি এবং সিমফনি ইনস্টল থাকে তবে সিমফোনির ওয়াইএএমএল পার্সার ব্যবহার করা খুব সহজ হতে পারে।

এই ক্ষেত্রে:

php -r "require '$SYMFONY_ROOT_PATH/vendor/autoload.php'; \
    var_dump(\Symfony\Component\Yaml\Yaml::parse(file_get_contents('$YAML_FILE_PATH')));"

এখানে আমি var_dumpপার্সড অ্যারে আউটপুট করতাম তবে অবশ্যই আপনি আরও অনেক কিছু করতে পারেন ... :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.