জেসসন পাঠ্যকে পার্স করার জন্য সেড কমান্ডের সাথে রেজেক্স


15

আমার এই জেসন পাঠ্যটি রয়েছে:

{
    "buildStatus" : {
        "status" : "ERROR",
        "conditions" : [{
                "status" : "OK",
                "metricKey" : "bugs"
            }, {
                "status" : "ERROR",
                "metricKey" : "test_success_density"
            }, {
                "status" : "OK",
                "metricKey" : "vulnerabilities"
            }
        ],
        "periods" : []
    }
}

আমি বিল্ডস্ট্যাটাসের সামগ্রিক স্থিতিটি বের করতে চাই, অর্থাৎ প্রত্যাশিত আউটপুটটি "ERROR" ছিল

"buildStatus" : {
    "status" : "ERROR",
    ....
}

আমি নীচে ছদ্মবেশী ভাবটি চেষ্টা করেছি, কিন্তু এটি কাজ করছে না, এটি ফিরে আসে OK:

status= sed -E 's/.*\"buildStatus\":.*\"status\":\"([^\"]*)\",.*/\1/' jsonfile

আমি কি ভুল করছি?

উত্তর:


16

JSON বা XML এর মতো জটিল নেস্টেড ডেটা স্ট্রাকচারগুলিকে নিয়মিত প্রকাশের সাহায্যে বিশ্লেষণ করবেন না, যেমন উপযুক্ত JSON পার্সার ব্যবহার করুন jshon

প্রথমে আপনাকে এটি ইনস্টল করতে হবে:

sudo apt-get install jshon

তারপরে আপনাকে স্ট্যান্ডার্ড ইনপুট দিয়ে পার্স করার জন্য এটি JSON ডেটা সরবরাহ করতে হবে, যাতে আপনি অন্য কোনও কমান্ডের আউটপুটটিকে পাইপ ( |) দিয়ে পুনর্নির্দেশ করতে পারেন বা এটিতে কোনও ফাইল পুনর্নির্দেশ করতে পারেন ( < filename)।

আপনি যে জাতীয় ডেটাটি দেখতে চান এটির জন্য আর্গুমেন্টগুলির প্রয়োজন:

jshon -e "buildStatus" -e "status" -u
  • -e "buildStatus" শীর্ষ স্তরের অভিধান থেকে "বিল্ডস্ট্যাটাস" সূচকটি দিয়ে উপাদানটি বেছে নিয়েছে।
  • -e "status" উপরের বাছাই করা দ্বিতীয় স্তরের অভিধান থেকে "স্থিতি" সূচক সহ উপাদানটিকে বেছে নিয়েছে।
  • -u JSON থেকে নির্বাচিত ডেটাটিকে সরল তথ্যতে রূপান্তরিত করে (যেমন এখানে এটি স্ট্রিংয়ের চারপাশে উদ্ধৃতিগুলি সরিয়ে দেয়)

সুতরাং আপনি যে আদেশটি চালাচ্ছেন তার উপর নির্ভর করে আপনি কোথা থেকে ডেটা পাবেন, তার মধ্যে একটির মতো দেখাচ্ছে:

jshon -e "buildStatus" -e "status" -u < YOUR_INPUT_FILE
YOUR_JSON_PRODUCING_COMMAND | jshon -e "buildStatus" -e "status" -u

আরো সম্পর্কে জানতে jshon, আপনি অনলাইনে অ্যাক্সেসযোগ্য তার র manpage পড়তে পারেন এখানে বা শুধু টাইপ করে man jshon


6
এছাড়াও রয়েছে jq:jq -r .buildStatus.status
মুরু


@HTNW আমি যে উত্তর না পছন্দ করেছেন কারণ "একক এক্সএমএল খোলা ট্যাগ" (যা কি প্রশ্ন জিজ্ঞাসা হয়) হয় একটি নিয়মিত ভাষা (এবং আপনি নীতি Build এ regexes ব্যবহার করে একটি পূর্ণ এক্সএমএল পার্সার ট্যাগ, মন্তব্য, CDATA মেলে পারে বিভাগগুলি এবং নেস্টেড প্রসঙ্গটি পরিচালনা করতে একটি সাধারণ স্ট্যাক ব্যবহার করে)। তবে, জেএসএনে সর্বাধিক 'আকর্ষণীয়' নিয়মিত ভাষা হ'ল একটি স্ট্রিং আক্ষরিক।
র্যান্ডম 832

10

এর জন্য চাকরি jq:

jq -r '.["buildStatus"]["status"]' file.json

সংক্ষিপ্ত করা যেতে পারে:

jq -r '.buildStatus.status' file.json

-r( --raw-output) jsonস্ট্রিং বিন্যাস ছাড়াই স্ট্রিংকে আউটপুট দেয় অর্থাৎ উদ্ধৃতি ছাড়াই।

উদাহরণ:

% cat file.json                   
{
    "buildStatus" : {
        "status" : "ERROR",
        "conditions" : [{
                "status" : "OK",
                "metricKey" : "bugs"
            }, {
                "status" : "ERROR",
                "metricKey" : "test_success_density"
            }, {
                "status" : "OK",
                "metricKey" : "vulnerabilities"
            }
        ],
        "periods" : []
    }
}

% jq -r '.["buildStatus"]["status"]' file.json
ERROR

% jq -r '.buildStatus.status' file.json       
ERROR

যদি ইতিমধ্যে ইনস্টল না করা থাকে তবে এটি দ্বারা ইনস্টল করুন (ইউনিভার্স রিপোজিটরিতে উপলব্ধ):

sudo apt-get install jq 

8

যেমনটি উল্লেখ করা হয়েছে, জটিল কাঠামোগত ডেটা পার্সিং যথাযথ এপিআই সহ ভাল। পাইথনের jsonজন্য মডিউল রয়েছে , যা আমি ব্যক্তিগতভাবে আমার স্ক্রিপ্টগুলিতে প্রচুর পরিমাণে ব্যবহার করি এবং আপনি যে পছন্দসই ক্ষেত্রগুলি চান তা উত্তোলন করা খুব সহজ:

$ python -c 'import sys,json;print json.load(sys.stdin)["buildStatus"]["status"]' <  input.txt
ERROR

এখানে যা ঘটে তা হ'ল আমরা ইনপুট ফাইলটি পাইথনের স্টিডিনে পুনর্নির্দেশ করি এবং এটি দিয়ে পড়ি json.load()। এটি কী "বিল্ডস্ট্যাটাস" এর সাথে অজগর অভিধানে পরিণত হয় এবং এতে "স্ট্যাটাস" কী সহ আরও একটি অজগর অভিধান রয়েছে contains সুতরাং, আমরা কেবল একটি অভিধানে একটি কী এর মান মুদ্রণ করছি যা অন্য অভিধানের মধ্যে সঞ্চিত আছে। মোটামুটি সহজ।

সরলতা বাদে আরেকটি সুবিধা হ'ল পাইথন এবং এই এপিআই সবগুলিই পূর্বনির্ধারিত এবং ডিফল্টরূপে উবুন্টুর সাথে আসে।


6

আপনি বাস্তবে এটি করতে পারেনsed , তবে আমি আপনাকে দৃ strongly়ভাবে অনুরোধ করছি যে আপনি আরও বেশি পরিশীলিত ভাষা ব্যবহার করুন যাতে জেএসওএন ডেটা পরিচালনা করার জন্য সরঞ্জামাদি লেখা রয়েছে। উদাহরণস্বরূপ, আপনি পার্ল বা অজগর চেষ্টা করতে পারেন।

এখন, আপনার সাধারণ উদাহরণে, আপনি যা চান তা হ'ল প্রথম ঘটনা "status", তাই আপনি এটি করতে পারেন:

$ sed -nE '/status/{s/.*:\s*"(.*)",/\1/p;q}' file.json 
ERROR

কৌতুক ব্যবহার করা -nএড়ানোর প্রিন্টিং, তারপর লাইন ম্যাচ যদি status( /status/), আপনি সবকিছু অপসারণ কিন্তু অংশ যদি আপনি চান s/.*:\s*"(.*)",/\1/, pলাইন এবং দ্রণ qUIT।


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

$ grep -m1 -oP '"status"\s*:\s*"\K[^"]+' file.json 
ERROR

বা এই এক:

$ perl -ne 'if(s/.*"status"\s*:\s*"([^"]+).*/$1/){print;exit}' file.json 
ERROR

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


বা grep -m 1 status file.json | tr -cd '[[:alnum:]]:' | cut -f2 -d':'
এটির

1
@ ব্যবহারকারী 1876040 আপনি স্বাগত জানাই। দয়া করে উত্তরগুলির মধ্যে একটি গ্রহণ করতে ভুলবেন না (আমি বাইটকম্যান্ডারের পরামর্শ দিচ্ছি , তার আরও ভাল সমাধান) যাতে প্রশ্নের উত্তর হিসাবে চিহ্নিত করা যায়)।
টেরডন

6

আপনার ব্যবহার করা উচিত না বলে sed(আমার মনে হয় কেউ বাধ্যতামূলক ক্যাভিয়েট না লেখার জন্য আমাকে কমিয়ে দিয়েছে) তবে, আপনার নিজের চেষ্টায় যেমন চেষ্টা করা হচ্ছে বলে মনে হচ্ছে আপনি যদি পরের লাইনে কিছু সন্ধান করতে চান তবে আপনাকে পড়তে buildStatusবলার দরকার আছে কমান্ড sedসহ পরবর্তী লাইনN

$ sed -rn '/buildStatus/N;s/.*buildStatus.*\n.*: "(.*)",/\1/p' file
ERROR

মন্তব্য:

  • -n যতক্ষণ না আমরা এটি চাওয়া অবধি কিছু মুদ্রণ করবেন না
  • -rপূর্ব ব্যবহার করুন (একই হিসাবে -E)
  • /buildStatus/N এই প্যাটার্নটি সন্ধান করুন এবং পরবর্তী লাইনেও পড়ুন
  • s/old/new/oldসঙ্গে প্রতিস্থাপনnew
  • .* লাইনের কোনও অক্ষরের সংখ্যা
  • \n নতুন লাইন
  • : "(.*)",: "এবং এর মধ্যে সংঘটিত যে কোনও অক্ষর সংরক্ষণ করুন",
  • \1 সংরক্ষিত প্যাটার্ন পিছনে রেফারেন্স
  • p যে অংশে আমরা কাজ করেছি তা মুদ্রণ করুন

0

কেন sedএবং অনুরূপ পাঠ্য স্ট্রিম প্রসেসিং সরঞ্জামগুলি JSON এবং XML এর মতো কাঠামোগত ডেটা পার্স করতে ভালভাবে সজ্জিত নয় এর একটি সাধারণ ব্যাখ্যা রয়েছে । আমার কাছে এটি নেই, তবে এটি বাইরে রয়েছে এবং আমি বিশ্বাস করি যে বিন্দুটি সকলের জন্য প্রয়োজন তবে সম্ভবত কয়েকটি পরিস্থিতিতে খুব কমই দ্রুত জটিল হয়ে ওঠে, অন্যদিকে কাঠামোটি বিশ্লেষণের জন্য বিশেষভাবে নির্মিত বিকল্প সরঞ্জামগুলি আরও বেশি একই পার্সিংয়ে মার্জিত, পঠনযোগ্য এবং দক্ষ।

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

বাইট কমান্ডার সুপারিশ বলে মনে হয় jshonমধ্যে অন্য উত্তর । আমি সেই সরঞ্জামটি ব্যবহার করি নি, তবে এটি আমাকে xmlstarletএবং এর সিনট্যাক্সের সাথে সাথে আউটপুটটির জন্য কিছু কাস্টমাইজযোগ্য উপস্থাপনারও স্মরণ করিয়ে দেয় ।


আপনি সম্ভবত
স্ট্যাকওভারফ্লো.

3
jsontool
ওপির

লল @ এমুরু, সঠিক, এটি রেজিএক্সের সাথে এক্সএমএল / জেএসএনকে পার্সিং থেকে ব্যবহারগুলি প্রতিরোধ করার চেষ্টা করা পোস্টগুলির মধ্যে একটি! আমি আরও পরামর্শ jqদিচ্ছিলাম যে মুড়ু এবং হিমাইল বর্ণনা করেছে যে ইতিমধ্যে বাহ্যিক রোগ রয়েছে এবং কেবল এর পিছনে যুক্তি পোস্ট করছি: Askubuntu.com/a/863948/230721
পিসিস

0

জসন নামে পরিচিত আর একটি জসন সরঞ্জাম ( https://github.com/trentm/json )

$ json buildStatus.status < file.json
ERROR

এই কেস স্টাডিটি বিভ্রান্তিকর: দেখে মনে হচ্ছে যে সরঞ্জামগুলি কাজ করছে না। আপনি jsonজসন ফাইলগুলি পরিবর্তন করার জন্যও ব্যবহার করতে পারেন :

$ json -e 'this.buildStatus.status="not error"' < file.json > new.json

অথবা এমনকি...

$ json -e 'this.buildStatus.status="no errors"' < file.json | json -e 'this.buildStatus.status
no errors

ডকুমেন্টেশন এতে: http://trentm.com/json/


ইনস্টল না থাকলে:

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