انگلیسیفرانسویاسپانیایی

Ad


فاویکون OnWorks

jq - آنلاین در ابر

jq را در ارائه دهنده هاست رایگان OnWorks از طریق Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا کنید.

این دستور jq است که می تواند در ارائه دهنده هاست رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.

برنامه:

نام


jq - پردازنده JSON خط فرمان

خلاصه


jq [گزینه های...] فیلتر [فایل ها...]

jq می تواند JSON را به روش های مختلف، با انتخاب، تکرار، کاهش و غیره تغییر دهد
دستکاری اسناد JSON به عنوان مثال، اجرای دستور jq «نقشه (.قیمت) | اضافه کردن اراده
آرایه ای از اشیاء JSON را به عنوان ورودی بگیرید و مجموع فیلدهای "قیمت" آنها را برگردانید.

jq می تواند ورودی متن را نیز بپذیرد، اما به طور پیش فرض، jq جریانی از موجودیت های JSON را می خواند
(شامل اعداد و لفظ های دیگر) از stdin. فضای خالی فقط برای جداسازی مورد نیاز است
موجوداتی مانند 1 و 2 و true و false. یکی یا بیشتر فایل ها ممکن است مشخص شود که در آن
مورد jq به‌جای آن ورودی‌ها را می‌خواند.

La گزینه های در شرح داده شده است فراخوانی JQ بخش؛ آنها بیشتر به ورودی و خروجی مربوط می شوند
قالب بندی فیلتر به زبان jq نوشته شده است و نحوه تبدیل آن را مشخص می کند
فایل یا سند ورودی

فیلتر


یک برنامه jq یک "فیلتر" است: یک ورودی می گیرد و یک خروجی تولید می کند. مقدار زیادی از ... وجود دارد
فیلترهای داخلی برای استخراج یک فیلد خاص از یک شی یا تبدیل یک عدد به
یک رشته یا وظایف استاندارد دیگر.

فیلترها را می توان به روش های مختلفی ترکیب کرد - می توانید خروجی یک فیلتر را به داخل لوله کنید
فیلتر دیگری، یا خروجی یک فیلتر را در یک آرایه جمع آوری کنید.

برخی از فیلترها چندین نتیجه را تولید می کنند، به عنوان مثال یکی وجود دارد که همه آنها را تولید می کند
عناصر آرایه ورودی آن لوله گذاری آن فیلتر در یک ثانیه فیلتر دوم را برای آن اجرا می کند
هر عنصر آرایه به طور کلی، کارهایی که با حلقه ها و تکرار انجام می شوند
در زبان های دیگر فقط با چسباندن فیلترها به هم در jq انجام می شود.

مهم است که به یاد داشته باشید که هر فیلتر یک ورودی و یک خروجی دارد. حتی به معنای واقعی کلمه
مانند "سلام" یا 42 فیلتر هستند - آنها یک ورودی دریافت می کنند اما همیشه همان کلمه تحت اللفظی را تولید می کنند
خروجی عملیاتی که دو فیلتر را ترکیب می کنند، مانند جمع، معمولا ورودی یکسانی را تغذیه می کنند
به هر دو و ترکیب نتایج. بنابراین، می توانید یک فیلتر میانگین گیری را به عنوان پیاده سازی کنید اضافه کردن / طول
- تغذیه آرایه ورودی هر دو به اضافه کردن فیلتر و طول فیلتر کنید و سپس اجرا کنید
تقسیم

اما این جلوتر از خودمان است. :) بیایید با چیز ساده تر شروع کنیم:

فراخوانی JQ


فیلترهای jq روی جریانی از داده های JSON اجرا می شوند. ورودی jq به صورت دنباله ای از تجزیه می شود
مقادیر JSON جدا شده با فضای خالی که از فیلتر ارائه شده یک به یک عبور می کنند
زمان. خروجی(های) فیلتر مجدداً به صورت دنباله ای از استاندارد نوشته می شود
داده های JSON جدا شده با فضای خالی.

توجه: توجه به قوانین نقل قول پوسته مهم است. به عنوان یک قانون کلی، بهتر است
همیشه (با کاراکترهای تک نقل قولی) برنامه jq را به عنوان کاراکترهای زیاد نقل قول کنید
معنای خاص jq نیز متا کاراکترهای پوسته هستند. مثلا، jq "فو" شکست خواهد خورد
اکثر پوسته های یونیکس زیرا همان پوسته های یونیکس خواهد بود jq فو، که به طور کلی شکست خواهد خورد
زیرا فو is نه مشخص. هنگام استفاده از پوسته فرمان ویندوز (cmd.exe) بهتر است
هنگامی که در خط فرمان داده می شود از دو نقل قول در اطراف برنامه jq خود استفاده کنید (به جای -f
فایل برنامه گزینه)، اما پس از آن نقل قول های دوگانه در برنامه jq نیاز به فرار از اسلش دارند.

شما می توانید بر نحوه خواندن و نوشتن ورودی و خروجی jq با استفاده از خط فرمان تأثیر بگذارید
گزینه ها:

· - نسخه:

نسخه jq را خروجی بگیرید و با صفر خارج شوید.

· -- دنباله:

استفاده از application/json-seq طرح نوع MIME برای جداسازی متون JSON در ورودی jq
و خروجی این بدان معنی است که یک کاراکتر ASCII RS (جداکننده رکورد) قبلاً چاپ شده است
هر مقدار در خروجی و یک ASCII LF (فید خط) بعد از هر خروجی چاپ می شود. ورودی
متن‌های JSON که تجزیه نمی‌شوند نادیده گرفته می‌شوند (اما در مورد آنها هشدار داده می‌شود)، و همه آنها را نادیده می‌گیرند
ورودی بعدی تا RS بعدی. این بیشتر نیز خروجی jq را بدون
-- دنباله گزینه.

· -- جریان:

ورودی را به صورت جریانی تجزیه و تحلیل کنید، آرایه های مسیر و مقادیر برگ را خروجی بگیرید
(اسکالرها و آرایه های خالی یا اشیاء خالی). مثلا، "یک" شود [[]،"آ"]و
[[]"a"،["b"]] شود [[0]،[]], [[1]"a"]و [[1,0]"b"].

این برای پردازش ورودی های بسیار بزرگ مفید است. از این به همراه استفاده کنید
فیلتر کردن و كاهش دادن و برای هر نحو برای کاهش تدریجی ورودی های بزرگ.

· --شلپ/-s:

به جای اجرای فیلتر برای هر شی JSON در ورودی، کل ورودی را بخوانید
به یک آرایه بزرگ پخش کنید و فیلتر را فقط یک بار اجرا کنید.

· --ورودی خام/-R:

ورودی را به عنوان JSON تجزیه نکنید. در عوض، هر خط از متن به عنوان یک به فیلتر ارسال می شود
رشته اگر با --شلپ، سپس کل ورودی به صورت a به فیلتر ارسال می شود
تک رشته بلند

· - ورودی صفر/-n:

هیچ ورودی را اصلاً نخوانید! در عوض، فیلتر یک بار با استفاده اجرا می شود تهی به عنوان ورودی
این هنگام استفاده از jq به عنوان یک ماشین حساب ساده یا ساخت داده های JSON از آن مفید است
خراش

· - خروجی فشرده / -c:

به طور پیش فرض، jq زیبا خروجی JSON را چاپ می کند. استفاده از این گزینه نتیجه بیشتری خواهد داشت
خروجی فشرده با قرار دادن هر شی JSON در یک خط واحد.

· -- تب:

به جای دو فاصله از یک زبانه برای هر سطح تورفتگی استفاده کنید.

· -- تورفتگی n:

از تعداد فضاهای داده شده (بیشتر از 8) برای تورفتگی استفاده کنید.

· - خروجی رنگ / -C و - خروجی تک رنگ / -M:

به طور پیش فرض، jq در صورت نوشتن در ترمینال، JSON رنگی را خروجی می دهد. میتونی مجبورش کنی
حتی در صورت نوشتن روی لوله یا فایل با استفاده از رنگ، رنگ تولید کنید -Cو رنگ را با غیر فعال کنید -M.

· --ascii-output / -a:

jq معمولاً نقاط کد یونیکد غیر ASCII را به صورت UTF-8 خروجی می دهد، حتی اگر ورودی مشخص شده باشد.
آنها را به عنوان دنباله های فرار (مانند "\u03bc"). با استفاده از این گزینه می توانید jq را مجبور کنید
خروجی ASCII خالص با هر نویسه غیر اسکی جایگزین با معادل آن تولید کنید
دنباله فرار

· - بدون بافر

پس از چاپ هر شیء JSON، خروجی را شستشو دهید (مفید است اگر لوله را کند می کنید
منبع داده به jq و لوله کشی خروجی jq در جای دیگر).

· -- کلیدهای مرتب سازی / -S:

خروجی فیلدهای هر شی با کلیدها به ترتیب مرتب شده است.

· - خروجی خام / -r:

با این گزینه، اگر نتیجه فیلتر یک رشته باشد، مستقیماً نوشته می شود
به جای اینکه به عنوان یک رشته JSON با نقل قول قالب بندی شود، به خروجی استاندارد برسد. این می تواند
برای ایجاد مکالمه فیلترهای jq با سیستم های غیر مبتنی بر JSON مفید است.

· ---output / -j:

پسندیدن -r اما jq بعد از هر خروجی یک خط جدید چاپ نمی کند.

· -f نام فایل / --از-فایل نام فایل:

خواندن فیلتر از فایل به جای یک خط فرمان، مانند گزینه awk´s -f. شما
همچنین می توانید از «#» برای نظر دادن استفاده کنید.

· -دایرکتوری / -L فهرست راهنما:

آماده کردن فهرست راهنما به لیست جستجوی ماژول ها. اگر از این گزینه استفاده می شود خیر
لیست جستجوی داخلی استفاده می شود. بخش ماژول ها را در زیر ببینید.

· -e / --خروج-وضعیت:

اگر آخرین مقادیر خروجی هیچکدام نبود، وضعیت خروج jq را روی 0 تنظیم می کند غلط نه تهی,
1 اگر آخرین مقدار خروجی یکی بود غلط or تهی، یا 4 اگر هیچ نتیجه معتبری وجود نداشت
تولید شده. به طور معمول jq با 2 خارج می شود اگر مشکل استفاده یا خطای سیستم وجود داشته باشد، 3
اگر خطای کامپایل برنامه jq وجود داشت، یا اگر برنامه jq اجرا شد 0.

· --arg نام ارزش:

این گزینه مقداری را به عنوان یک متغیر از پیش تعریف شده به برنامه jq ارسال می کند. اگر jq را اجرا می کنید
با --arg فو بار، و سپس $ foo در برنامه موجود است و دارای ارزش است "بار".
توجه داشته باشید که ارزش به عنوان یک رشته رفتار خواهد شد، بنابراین --arg فو 123 مقید خواهد شد $ foo به "123".

· --ارگسون نام JSON-text:

این گزینه یک مقدار رمزگذاری شده با JSON را به عنوان یک متغیر از پیش تعریف شده به برنامه jq ارسال می کند. اگر
شما jq را با --ارگسون فو 123، و سپس $ foo در برنامه موجود است و دارای
ارزش 123.

· --slurpfile متغیر-نام نام فایل:

این گزینه تمام متون JSON را در فایل نامگذاری شده می خواند و آرایه ای از آن را متصل می کند
مقادیر JSON را به متغیر جهانی داده شده تجزیه کرد. اگر jq را با --argfile فو بار,
سپس $ foo در برنامه موجود است و آرایه ای دارد که عناصر آن مطابقت دارد
متون موجود در فایل نامگذاری شده بار.

· --argfile متغیر-نام نام فایل:

استفاده نکن. استفاده کنید --slurpfile به جای آن.

(این گزینه مانند --slurpfile، اما زمانی که فایل فقط یک متن داشته باشد، آنوقت است
استفاده می شود، در غیر این صورت از آرایه ای از متون مانند در استفاده می شود --slurpfile.)

· --آزمون های اجرا [نام فایل]:

تست ها را در فایل داده شده یا ورودی استاندارد اجرا می کند. این باید آخرین گزینه ارائه شده باشد
و همه گزینه های قبلی را رعایت نمی کند. ورودی شامل خطوط نظر، خالی است
خطوط، و خطوط برنامه به دنبال یک خط ورودی، به تعداد خطوط خروجی
مورد انتظار (یکی در هر خروجی)، و یک خط خالی پایانی. تست های شکست کامپایل
با خطی شروع کنید که فقط حاوی «%%FAIL» است، سپس خطی حاوی برنامه به
کامپایل، سپس یک خط حاوی یک پیام خطا برای مقایسه با واقعی است.

هشدار داده می شود که این گزینه می تواند به صورت ناسازگار تغییر کند.

BASIC فیلتر


.
ساده ترین (و کم جالب ترین) فیلتر است .. این فیلتری است که آن را می گیرد
ورودی و آن را بدون تغییر به عنوان خروجی تولید می کند.

از آنجایی که jq به‌طور پیش‌فرض همه خروجی‌ها را زیبا چاپ می‌کند، این برنامه بی‌اهمیت می‌تواند راه مفیدی باشد
فرمت کردن خروجی JSON از مثلاً حلقه.

jq '.'
"سلام دنیا!"
=> "سلام، دنیا!"

.فو، .foo.bar
ساده ترین مفید فیلتر است .فو. هنگامی که یک شی JSON (معروف به فرهنگ لغت یا هش) به عنوان
ورودی، مقدار را روی کلید "foo" تولید می‌کند، یا اگر هیچ یک وجود نداشته باشد، صفر می‌شود.

اگر کلید حاوی نویسه‌های خاصی است، باید اطراف آن را با نقل قول‌های دوتایی احاطه کنید
این: "foo$".

فیلتر فرم .foo.bar برابر است با .foo|.bar.

jq ´.foo´
{"foo": 42، "bar": "داده های کمتر جالب"}
=> 42

jq ´.foo´
{"notfoo": درست، "alsonotfoo": نادرست}
=> پوچ

jq ´.["foo"]´
{"foo": 42}
=> 42

.فو؟
درست مثل .فو، اما حتی یک خطا را زمانی که . یک آرایه یا یک شی نیست.

jq '.foo؟'
{"foo": 42، "bar": "داده های کمتر جالب"}
=> 42

jq '.foo؟'
{"notfoo": درست، "alsonotfoo": نادرست}
=> پوچ

jq ´.["foo"]؟'
{"foo": 42}
=> 42

jq '[.foo?]'
[1,2]
=> []

[ ]، [2]، [10:15]
همچنین می توانید فیلدهای یک شی را با استفاده از نحوی مانند جستجو کنید .["فو"] (.foo بالا یک است
نسخه مختصر این). این یکی برای آرایه ها نیز کار می کند، اگر کلید یک عدد صحیح باشد.
آرایه ها مبتنی بر صفر هستند (مانند جاوا اسکریپت)، بنابراین . [2] سومین عنصر آرایه را برمی گرداند.

La [10:15] سینتکس می تواند برای برگرداندن یک زیرآرایه از یک آرایه یا زیر رشته از یک رشته استفاده شود.
آرایه توسط [10:15] به طول 5 خواهد بود که حاوی عناصر شاخص 10 است
(شامل) تا شاخص 15 (انحصاری). هر یک از این شاخص ها ممکن است منفی باشد (در این صورت مهم است
به عقب از انتهای آرایه)، یا حذف شده است (در این صورت به شروع یا اشاره دارد
انتهای آرایه).

La . [2] از syntax می توان برای برگرداندن عنصر در شاخص داده شده استفاده کرد. شاخص های منفی هستند
مجاز است، با -1 به آخرین عنصر، -2 اشاره به عنصر بعدی به آخرین عنصر،
و الی آخر.

La .فو نحو فقط برای کلیدهای ساده کار می کند، یعنی کلیدهایی که همه کاراکترهای الفبایی هستند.
[ ] با کلیدهایی کار می کند که شامل کاراکترهای خاص مانند دو نقطه و نقطه است. برای
مثال .["foo::bar"] و .["foo.bar"] در حالی که کار کنید .foo::bar و .foo.bar نمی خواهد.

La ? "اپراتور" همچنین می تواند با عملگر slice استفاده شود، همانطور که در [10:15]؟، که خروجی می دهد
مقادیری که در آن ورودی ها قابل برش هستند.

jq '.[0]'
[{"name":"JSON"، "good":true}، "name":"XML"، "good":false}]
=> {"name":"JSON"، "good":true}

jq '.[2]'
[{"name":"JSON"، "good":true}، "name":"XML"، "good":false}]
=> پوچ

jq ´. [2:4]´
["الف"، "ب"، "ج"، "د"، "ه"]
=> ["c"، "d"]

jq ´. [2:4]´
"ابجدی"
=> "سی دی"

jq ´.[:3]´
["الف"، "ب"، "ج"، "د"، "ه"]
=> ["a"، "b"، "c"]

jq ´.[-2:]´
["الف"، "ب"، "ج"، "د"، "ه"]
=> ["d"، "e"]

jq ´.[-2]´
[1,2,3]
=> 2

.[]
اگر از شما استفاده می کنید .[فهرست مطالب] نحو، اما ایندکس را به طور کامل حذف کنید، باز خواهد گشت تمام از
عناصر یک آرایه در حال دویدن .[] با ورودی [1,2,3] اعداد را به صورت سه تولید می کند
نتایج جداگانه، به جای یک آرایه واحد.

شما همچنین می توانید از این روی یک شی استفاده کنید و تمام مقادیر شی را برمی گرداند.

jq '.[]'
[{"name":"JSON"، "good":true}، "name":"XML"، "good":false}]
=> {"name":"JSON"، "good":true}، "name":"XML"، "good":false}

jq '.[]'
[]
=>

jq '.[]'
{"a": 1، "b": 1}
=> 1، 1

.[]؟
پسندیدن .[]، اما هیچ خطایی خروجی نمی شود اگر . آرایه یا شی نیست.

,
اگر دو فیلتر با کاما از هم جدا شوند، ورودی به هر دو و آنجا وارد می شود
خروجی های متعدد خواهد بود: اول، تمام خروجی های تولید شده توسط عبارت سمت چپ، و
سپس تمام خروجی های تولید شده توسط سمت راست. به عنوان مثال، فیلتر کنید .فو، .بارتولید می کند
هر دو قسمت "foo" و "bar" به عنوان خروجی جداگانه.

jq ´.foo، .bar´
{"foo": 42، "bar": "something"، "baz": true}
=> 42، "چیز دیگری"

jq '.user, .projects[]'
{"user":"stedolan"، "projects": ["jq"، "wikiflow"]}
=> "stedolan"، "jq"، "wikiflow"

jq '.[4,2]'
["الف"، "ب"، "ج"، "د"، "ه"]
=> "e"، "c"

|
| اپراتور دو فیلتر را با تغذیه خروجی (های) یکی از سمت چپ به داخل ترکیب می کند
ورودی سمت راست این تقریباً مشابه لوله پوسته یونیکس است، اگر
تو به آن عادت کرده ای

اگر یکی در سمت چپ چندین نتیجه ایجاد کند، یکی در سمت راست برای اجرا اجرا می شود
هر یک از آن نتایج بنابراین، بیان .[] | .فو فیلد "foo" هر کدام را بازیابی می کند
عنصر آرایه ورودی

jq ´.[] | .نام
[{"name":"JSON"، "good":true}، "name":"XML"، "good":false}]
=> "JSON"، "XML"

انواع و ارزش


jq از مجموعه ای از انواع داده ها مانند JSON پشتیبانی می کند - اعداد، رشته ها، بولین ها، آرایه ها،
اشیاء (که در JSON-speak هش تنها با کلیدهای رشته ای هستند) و "null".

بولی ها، تهی، رشته ها و اعداد به همان روشی که در جاوا اسکریپت نوشته می شوند. درست مثل
هر چیز دیگری در jq، این مقادیر ساده یک ورودی می گیرند و یک خروجی تولید می کنند - 42 هست یک
عبارت معتبر jq که یک ورودی می گیرد، آن را نادیده می گیرد و در عوض 42 را برمی گرداند.

صف ساخت و ساز - []
مانند JSON، [] برای ساخت آرایه ها استفاده می شود، مانند [1,2,3]. عناصر آرایه ها می توانند
هر عبارت jq باشد. تمام نتایج تولید شده توسط تمام عبارات جمع آوری شده است
در یک آرایه بزرگ می توانید از آن برای ساخت یک آرایه از مقدار مشخصی از مقادیر استفاده کنید
(همانطور که در [.فو، .بار، باز]) یا برای "جمع آوری" تمام نتایج یک فیلتر در یک آرایه (مانند
in [.itms[].name])

هنگامی که عملگر "" را درک کردید، می توانید به نحو آرایه jq به شکل دیگری نگاه کنید
نور: بیان [1,2,3] از یک نحو داخلی برای آرایه های جدا شده با کاما استفاده نمی کند،
اما به جای آن از [] عملگر (نتایج را جمع آوری کنید) به عبارت 1,2,3،XNUMX،XNUMX (که
سه نتیجه متفاوت ایجاد می کند).

اگر فیلتر دارید X که چهار نتیجه تولید می کند، سپس عبارت [X] تولید خواهد کرد
نتیجه واحد، آرایه ای از چهار عنصر.

jq '[.user, .projects[]]'
{"user":"stedolan"، "projects": ["jq"، "wikiflow"]}
=> ["stedolan"، "jq"، "wikiflow"]

اشیاء - {}
مانند JSON، {} برای ساختن اشیا (معروف به دیکشنری یا هش) است، مانند: {"آ": شماره ۱۰۲۹،
"ب": سیزده}.

اگر کلیدها "معقول" هستند (همه حروف الفبا)، پس می توان نقل قول ها را کنار گذاشت.
مقدار می تواند هر عبارتی باشد (اگرچه ممکن است لازم باشد آن را در پرانتز بپیچید
یک پیچیده)، که در ورودی عبارت {} اعمال می شود (به یاد داشته باشید، همه فیلترها
یک ورودی و یک خروجی داشته باشد).

{foo: .bar}

شی JSON را تولید خواهد کرد {"foo": سیزده} اگر شی JSON داده شود {"bar":42, "باز":43}.
می توانید از این برای انتخاب فیلدهای خاص یک شی استفاده کنید: اگر ورودی یک شی با
فیلدهای "user"، "title"، "id" و "content" و شما فقط "user" و "عنوان" را می خواهید، می توانید
نوشتن

{user: .user، عنوان: .title}

از آنجا که بسیار رایج است، یک نحو میانبر وجود دارد: {کاربر، عنوان}.

اگر یکی از عبارات چندین نتیجه ایجاد کند، فرهنگ لغت های متعدد خواهد بود
تولید شده. اگر ورودی است

{"user":"stedolan","titles":["JQ Primer"، "More JQ"]}

سپس بیان

{کاربر، عنوان: .titles[]}

دو خروجی تولید خواهد کرد:

{"user":"stedolan", "title": "JQ Primer"}
{"user":"stedolan", "title": "More JQ"}

قرار دادن پرانتز در اطراف کلید به این معنی است که به عنوان یک عبارت ارزیابی می شود. با
همان ورودی بالا،

{(.user): .titles}

تولید می کند

{"stedolan": ["JQ Primer"، "More JQ"]}

jq '{کاربر، عنوان: .titles[]}'
{"user":"stedolan","titles":["JQ Primer"، "More JQ"]}
=> {"user":"stedolan"، "title": "JQ Primer"}، {"user":"stedolan"، "title": "More JQ"}

jq ´{(.user): .titles}´
{"user":"stedolan","titles":["JQ Primer"، "More JQ"]}
=> {"stedolan": ["JQ Primer"، "More JQ"]}

ساخته شده اپراتورها و توابع


برخی از عملگرهای jq (به عنوان مثال، +) بسته به نوع آنها کارهای مختلفی انجام دهید
آرگومان ها (آرایه ها، اعداد و غیره). با این حال، jq هرگز تبدیل نوع ضمنی را انجام نمی دهد. اگر
شما سعی می کنید یک رشته به یک شی اضافه کنید، یک پیغام خطا دریافت می کنید و نتیجه ای دریافت نمی کنید.

اضافه - +
اپراتور + دو فیلتر می گیرد، هر دو را روی یک ورودی اعمال می کند و آن را اضافه می کند
نتایج با هم معنای "افزودن" به انواع درگیر بستگی دارد:

· تعداد با حساب عادی اضافه می شوند.

· آرایه ها با الحاق به یک آرایه بزرگتر اضافه می شوند.

· رشته با پیوستن به یک رشته بزرگتر اضافه می شوند.

· اشیاء با ادغام، یعنی درج تمام جفت‌های کلید-مقدار از هر دو، اضافه می‌شوند
اشیاء در یک شیء ترکیبی واحد. اگر هر دو شی دارای یک مقدار برای یکسان باشند
کلید، شی در سمت راست + برنده می شود. (برای ادغام بازگشتی از * اپراتور.)

تهی را می توان به هر مقدار اضافه کرد و مقدار دیگر را بدون تغییر برمی گرداند.

jq ´.a + 1´
{"a": 7}
=> 8

jq ´.a + .b´
{"a": [1,2،3,4]، "b": [XNUMX،XNUMX]}
=> [1,2,3,4،XNUMX،XNUMX،XNUMX]

jq ´.a + null´
{"a": 1}
=> 1

jq ´.a + 1´
{}
=> 1

jq ´{a: 1} + {b: 2} + {c: 3} + {a: 42}´
تهی
=> {"a": 42، "b": 2، "c": 3}

تفریق - -
و همچنین تفریق حسابی معمولی روی اعداد، - عملگر را می توان روی آرایه ها استفاده کرد
برای حذف تمام رخدادهای عناصر آرایه دوم از آرایه اول.

jq ´4 - .a´
{"a":3}
=> 1

jq ´. - ["xml"، "yaml"]´
["xml"، "yaml"، "json"]
=> ["json"]

ضرب، تقسیم، مدول - *, /, و %
این عملگرهای infix هنگامی که دو عدد داده می شوند، همانطور که انتظار می رود رفتار می کنند. تقسیم بر صفر افزایش می دهد
یک خطا. x % y x مدول y را محاسبه می کند.

ضرب یک رشته در یک عدد باعث الحاق آن رشته به این تعداد می شود
بار. "ایکس" * 0 تولید می کند تهی.

با تقسیم یک رشته به رشته دیگر، رشته اول با استفاده از رشته دوم به عنوان جداکننده تقسیم می شود.

ضرب دو شیء آنها را به صورت بازگشتی ادغام می کند: این کار مانند جمع است اما اگر هر دو باشد
اشیاء حاوی یک مقدار برای یک کلید هستند، و مقادیر اشیاء هستند، این دو با هم ادغام می شوند
با همین استراتژی

jq ´10 / . * 3'
5
=> 6

jq ´. / "، "'
"الف، ب، ج، د، ه"
=> ["a"، "b،c،d"،"e"]

jq ´{"k": {"a": 1، "b": 2}} * {"k": {"a": 0,"c": 3}}´
تهی
=> {"k": {"a": 0، "b": 2، "c": 3}}

jq ´.[] | (1 / .)؟'
[1,0،1،XNUMX،XNUMX،XNUMX ، -XNUMX]
=> 1، -1

طول
تابع داخلی طول طول انواع مختلف ارزش را بدست می آورد:

· طول a رشته تعداد کدهای یونیکد موجود در آن است (که خواهد بود
همان طول رمزگذاری شده با JSON آن بر حسب بایت اگر ASCII خالص باشد).

· طول یک صف تعداد عناصر است.

· طول یک هدف تعداد جفت های کلید-مقدار است.

· طول تهی صفر است

jq ´.[] | length´ [[1,2], "string", {"a":2}, null] => 2, 6, 1, 0

کلیدها ، keys_unsorted
تابع داخلی کلید، وقتی به یک شی داده می شود، کلیدهای آن را در یک آرایه برمی گرداند.

کلیدها بر اساس حروف الفبا، به ترتیب کد یونیکد مرتب شده اند. این دستور نیست
که در هر زبان خاص معنی خاصی دارد، اما می توانید روی آن حساب کنید
برای هر دو شی با مجموعه کلیدهای یکسان، بدون توجه به تنظیمات محلی، یکسان است.

چه زمانی کلید آرایه ای داده می شود، شاخص های معتبر آن آرایه را برمی گرداند: اعداد صحیح
از 0 تا طول-1.

La keys_unsorted تابع درست مثل کلید، اما اگر ورودی یک شی است، کلیدها
مرتب نخواهد شد، در عوض کلیدها تقریباً به ترتیب درج خواهند بود.

کلیدهای jq
{"abc": 1، "abcd": 2، "foo": 3}
=> ["Foo"، "abc"، "abcd"]

کلیدهای jq
[42,3,35]
=> [0,1,2،XNUMX،XNUMX،XNUMX]

دارای (کلید)
تابع داخلی است برمی گرداند که آیا شی ورودی کلید داده شده یا ورودی را دارد
آرایه یک عنصر در شاخص داده شده دارد.

دارای ($key) همان اثری را دارد که بررسی کنید آیا کلید $ عضوی از آرایه بازگشتی است
by کلیدهر چند است سریعتر خواهد بود.

jq 'map(has("foo"))'
[{"foo": 42}، {}]
=> [درست، نادرست]

نقشه jq(است(2))'
[[0,1،XNUMX]، ["الف"، "ب"، "ج"]]
=> [نادرست، درست]

in
تابع داخلی in کلید ورودی را در شی داده شده یا شاخص ورودی برمی گرداند
مربوط به یک عنصر در آرایه داده شده است. این اساساً نسخه معکوس آن است
است.

jq ´.[] | in({"foo": 42})´
["فو"، "بار"]
=> درست، نادرست

jq 'map(in([0,1]))'
[2، 0]
=> [نادرست، درست]

مسیر (path_expression)
نمایش های آرایه ای از عبارت مسیر داده شده را در خروجی می دهد .. خروجی ها آرایه هایی از
رشته ها (کلیدهای موجود در اشیاء0 و/یا اعداد (شاخص های آرایه.

عبارات مسیر عباراتی مانند jq هستند .a، بلکه .[]. دو نوع مسیر وجود دارد
عبارات: آنهایی که می توانند دقیقاً مطابقت داشته باشند و آنهایی که نمی توانند. مثلا، .abc است
بیان مسیر تطبیق دقیق، while .a[].b نیست.

مسیر (exact_path_expression) نمایش آرایه عبارت مسیر را تولید خواهد کرد
حتی اگر در آن وجود نداشته باشد .، اگر . is تهی یا یک آرایه یا یک شی.

مسیر (الگو) نمایش های آرایه ای از تطابق مسیرها را تولید می کند الگو اگر
مسیرها در ..

توجه داشته باشید که عبارات مسیر با عبارات عادی تفاوتی ندارند. بیان
مسیر(..|انتخاب(نوع=="بولی")) خروجی تمام مسیرهای رسیدن به مقادیر بولی در .، و فقط
آن مسیرها

jq 'path(.a[0].b)'
تهی
=> ["a"،0،"b"]

jq '[مسیر(..)]'
{"a":[{"b":1}]}
=> [[]، ["a"]، ["a"،0]، ["a"،0،"b"]]

del(path_expression)
تابع داخلی از یک کلید و مقدار مربوط به آن را از یک شی حذف می کند.

jq ´del(.foo)´
{"foo": 42، "bar": 9001، "baz": 42}
=> {"bar": 9001، "baz": 42}

jq ´del(.[1, 2])´
["فو"، "بار"، "باز"]
=> ["فو"]

to_entries، from_entries, with_entries
این توابع بین یک شی و آرایه ای از جفت های کلید-مقدار تبدیل می شوند. اگر to_entries
یک شی ارسال می شود، سپس برای هر یک k: v ورود در ورودی، آرایه خروجی شامل
{"کلید": k, "ارزش": v}.

from_entries تبدیل مخالف را انجام می دهد و with_entries (foo) یک شاهرود برای است
to_entries | نقشه (foo) | from_entries، مفید برای انجام برخی عملیات به تمام کلیدها و
مقادیر یک شی from_entries کلید، کلید، نام، مقدار و مقدار را به عنوان کلید می پذیرد.

jq ´to_entries´
{"a": 1، "b": 2}
=> [{"key":"a"، "value":1}، {"key":"b"، "value":2}]

jq 'from_entries'
[{"key":"a"، "value":1}، {"key":"b"، "value":2}]
=> {"a": 1، "b": 2}

jq ´with_entries(.key |= "KEY_" + .)´
{"a": 1، "b": 2}
=> {"KEY_a": 1، "KEY_b": 2}

انتخاب (بیان_بولی)
تابع انتخاب (foo) اگر ورودی خود را بدون تغییر تولید می کند فو برای آن ورودی true برمی گرداند،
و در غیر این صورت هیچ خروجی تولید نمی کند.

برای فیلتر کردن لیست ها مفید است: [1,2,3] | نقشه (انتخاب کنید >= 2/XNUMX/XNUMX)) به تو خواهد داد [2,3].

jq 'map(select(. >= 2))'
[1,5,3,0,7]
=> [5,3,7،XNUMX،XNUMX،XNUMX]

jq ´.[] | select(.id == "دوم")´
[{"id": "اول"، "val": 1}، {"id": "ثانیه"، "val": 2}]
=> {"id": "ثانیه"، "val": 2}

آرایه ها، اشیاء، تکرار شونده ها بولین ها، شماره، عادی، متناهی، رشته های، پوچ، ارزش های،
اسکالرها
این داخلی‌ها فقط ورودی‌هایی را انتخاب می‌کنند که آرایه‌ها، اشیاء، تکرارپذیرها (آرایه‌ها یا
اشیا)، بولی ها، اعداد، اعداد عادی، اعداد متناهی، رشته ها، تهی، غیر تهی
مقادیر، و غیر قابل تکرار، به ترتیب.

jq ´.[]| اعداد´
[[],{},1,foo,null,true, false]
=> 1

خالی
خالی نتیجه ای بر نمی گرداند اصلا. حتی نه تهی.

در مناسبت ها مفید است میفهمی اگه بهش نیاز داری :)

jq '1، خالی، 2'
تهی
=> 1، 2

jq «[1,2،3، خالی، XNUMX]».
تهی
=> [1,2,3،XNUMX،XNUMX،XNUMX]

خطا(پیام)
یک خطا تولید می کند، درست مثل .a برای مقادیری غیر از null و اشیاء، اما اعمال می شود
با پیام داده شده به عنوان مقدار خطا.

$__loc__
یک شی با یک کلید "فایل" و یک کلید "خط" با نام فایل و شماره خط تولید می کند
جایی که $__loc__ به عنوان مقادیر رخ می دهد.

jq ´sry error("\($__loc__)") catch .'
تهی
=> "{\"file\":\" \"،\"خط 1}"

نقشه (x) map_values ​​(x)
برای هر فیلتری x, نقشه (x) آن فیلتر را برای هر عنصر آرایه ورودی اجرا می کند و
خروجی ها را یک آرایه جدید تولید کنید. نقشه (.+1) هر عنصر از یک آرایه را افزایش می دهد
اعداد.

به طور مشابه، map_values ​​(x) آن فیلتر را برای هر عنصر اجرا می کند، اما یک را برمی گرداند
وقتی یک شی منتقل می شود، شی.

نقشه (x) برابر است با [.[] | x]. در واقع اینگونه تعریف شده است. به همین ترتیب،
map_values ​​(x) است تعریف می شود .[] |= x.

jq 'map(.+1)'
[1,2,3]
=> [2,3,4،XNUMX،XNUMX،XNUMX]

jq 'map_values(.+1)'
{"a": 1، "b": 2، "c": 3}
=> {"a": 2، "b": 3، "c": 4}

راه ها، مسیرها (node_filter) مسیرهای برگ
راه ها مسیرهای تمام عناصر ورودی خود را خروجی می دهد (به جز اینکه خروجی آن را ندارد
لیست خالی، نشان دهنده . خودش).

مسیرها (f) خروجی مسیر به هر مقدار که برای f درست است. به این معنا که، مسیرها (اعداد)
خروجی مسیرهای تمام مقادیر عددی است.

مسیرهای برگ نام مستعار است مسیرها (اسکالرها); مسیرهای برگ is منسوخ و در حذف خواهد شد
نسخه اصلی بعدی

jq '[مسیرها]'
[1،[[]،{"a":2}]]
=> [[0],[1],[1,0],[1,1],[1,1,"a"]]

jq '[مسیرها (اسکالارها)]'
[1،[[]،{"a":2}]]
=> [[0]، [1,1،XNUMX،" a"]]

اضافه کردن
فیلتر اضافه کردن یک آرایه را به عنوان ورودی می گیرد و عناصر آرایه را به عنوان خروجی تولید می کند
با هم اضافه شدند. این ممکن است به معنای جمع، الحاق یا ادغام بسته به انواع باشد
عناصر آرایه ورودی - قوانین مشابه قوانین برای هستند + اپراتور
(در بالا توضیح داده شد).

اگر ورودی یک آرایه خالی باشد، اضافه کردن بازده تهی.

jq «افزودن».
["الف"، "ب"، "ج"]
=> "abc"

jq «افزودن».
[1، 2، 3]
=> 6

jq «افزودن».
[]
=> پوچ

هر، هر (شرط) هر(مولد وضعیت)
فیلتر هر آرایه ای از مقادیر بولی را به عنوان ورودی می گیرد و تولید می کند درست به عنوان خروجی اگر
هر یک از عناصر آرایه است درست.

اگر ورودی یک آرایه خالی باشد، هر بازده غلط.

La هر (شرط) form شرط داده شده را برای عناصر آرایه ورودی اعمال می کند.

La هر(مولد وضعیت) فرم شرط داده شده را برای همه خروجی های the اعمال می کند
ژنراتور داده شده

jq 'هر کدام'
[درست غلط]
=> درست است

jq 'هر کدام'
[نادرست، نادرست]
=> نادرست

jq 'هر کدام'
[]
=> نادرست

همه، همه (شرط) all(مولد وضعیت)
فیلتر تمام آرایه ای از مقادیر بولی را به عنوان ورودی می گیرد و تولید می کند درست به عنوان خروجی اگر
همه عناصر آرایه هستند درست.

La همه (شرط) form شرط داده شده را برای عناصر آرایه ورودی اعمال می کند.

La all(مولد وضعیت) فرم شرط داده شده را برای همه خروجی های the اعمال می کند
ژنراتور داده شده

اگر ورودی یک آرایه خالی باشد، تمام بازده درست.

jq 'همه'
[درست غلط]
=> نادرست

jq 'همه'
[صحیح صحیح]
=> درست است

jq 'همه'
[]
=> درست است

[نیاز دارد 1.5] صاف کردن، صاف کردن (عمق)
فیلتر صاف کردن آرایه ای از آرایه های تو در تو را به عنوان ورودی می گیرد و یک آرایه مسطح در داخل تولید می کند
که تمام آرایه های داخل آرایه اصلی به صورت بازگشتی با مقادیر خود جایگزین شده اند.
می توانید یک آرگومان به آن ارسال کنید تا مشخص کنید چند سطح از تودرتو باید مسطح شود.

صاف کردن(2) مثل این است صاف کردن، اما فقط تا دو سطح عمیق می رود.

jq «صاف کردن».
[1، [2]، [[3]]]
=> [1، 2، 3]

jq ´صاف کردن(1)'
[1، [2]، [[3]]]
=> [1، 2، [3]]

jq «صاف کردن».
[[]]
=> []

jq «صاف کردن».
[{"foo": "bar"}، [{"foo": "baz"}]]
=> [{"foo": "bar"}، {"foo": "baz"}]

محدوده (تا)، محدوده (از; تا) محدوده (از; تا; توسط)
La محدوده تابع طیفی از اعداد را تولید می کند. محدوده (4;10) از 6 4 عدد تولید می کند
(شامل) تا 10 (انحصاری). اعداد به عنوان خروجی جداگانه تولید می شوند. استفاده کنید
[محدوده (4;10)] برای بدست آوردن یک محدوده به عنوان یک آرایه.

فرم یک آرگومان اعدادی از 0 تا عدد داده شده را با یک افزایش تولید می کند
1.

فرم دو آرگومان اعداد را از از جانب به تا با افزایش 1.

فرم سه آرگومان اعداد را تولید می کند از جانب به تا با افزایش by.

jq 'محدوده (2;4)'
تهی
=> 2، 3

jq '[محدوده(2;4)]'
تهی
=> [2,3،XNUMX،XNUMX،XNUMX]

jq '[محدوده(4)]'
تهی
=> [0,1,2,3،XNUMX،XNUMX،XNUMX]

jq '[محدوده(0;10;3)]'
تهی
=> [0,3,6,9،XNUMX،XNUMX،XNUMX]

jq '[محدوده(0;10;-1)]'
تهی
=> []

jq '[محدوده(0;-5;-1)]'
تهی
=> [0,-1,-2,-3,-4]

طبقه
La طبقه تابع کف ورودی عددی خود را برمی گرداند.

jq 'طبقه'
3.14159
=> 3

sqrt
La sqrt تابع جذر ورودی عددی خود را برمی گرداند.

jq ´sqrt´
9
=> 3

تعداد
La تعداد تابع ورودی خود را به صورت عدد تجزیه می کند. آن را به درستی فرمت تبدیل خواهد شد
رشته ها را به معادل عددی خود رها کنید، اعداد را به حال خود رها کنید و روی بقیه یک خطا بدهید
ورودی

jq ´.[] | شماره'
[1، "1"]
=> 1، 1

طناب زدن
La طناب زدن تابع ورودی خود را به صورت رشته چاپ می کند. رشته ها بدون تغییر باقی مانده اند، و همه
سایر مقادیر با JSON کدگذاری می شوند.

jq ´.[] | tostring'
[1، "1"، [1]]
=> "1"، "1"، "[1]"

نوع
La نوع تابع نوع آرگومان خود را به صورت رشته ای برمی گرداند که یکی از null است.
بولی، عدد، رشته، آرایه یا شی.

jq 'نقشه (نوع)'
[0، نادرست، []، {}، تهی، "سلام"]
=> ["عدد"، "بولی"، "آرایه"، "شیء"، "تهی"، "رشته"]

بي نهايت، جواب منفی، بی نهایت، اسنان، بی نهایت، طبیعی است
برخی از عملیات های حسابی می توانند بی نهایت ها و مقادیر "نه عدد" (NaN) را به دست آورند. در
بی نهایت بازده داخلی درست اگر ورودی آن بی نهایت باشد. در اسنان بازده داخلی درست
اگر ورودی آن NaN باشد. در نا محدود buildin یک مقدار بی نهایت مثبت را برمی گرداند. در نان
ساخته شده یک NaN برمی گرداند. در طبیعی است اگر ورودی آن یک عدد معمولی باشد true برمی گرداند.

توجه داشته باشید که تقسیم بر صفر باعث ایجاد خطا می شود.

در حال حاضر اکثر عملیات های حسابی که بر روی بی نهایت ها، NaN ها و زیر نرمال ها عمل می کنند، انجام نمی دهند.
خطاها را بالا ببرد

jq ´.[] | (بی نهایت * .) < 0´
[-1، 1]
=> درست، نادرست

jq 'بی نهایت، نان | نوع'
تهی
=> "تعداد"، "تعداد"

مرتب سازی، مرتب سازی بر اساس (مسیر_عبارت)
La نوع توابع ورودی خود را که باید یک آرایه باشد مرتب می کند. مقادیر در طبقه بندی شده اند
ترتیب زیر

· تهی

· غلط

· درست

· شماره

· رشته ها به ترتیب حروف الفبا (بر اساس مقدار کد یونیکد)

· آرایه ها به ترتیب واژگانی

· اشیاء

ترتیب اشیا کمی پیچیده است: ابتدا آنها با مقایسه آنها مقایسه می شوند
مجموعه‌ای از کلیدها (به عنوان آرایه‌ها به ترتیب مرتب‌شده)، و اگر کلیدهای آن‌ها با هم برابر باشند، مقادیر برابر هستند
مقایسه کلید به کلید

نوع ممکن است برای مرتب سازی بر اساس یک فیلد خاص از یک شی یا با اعمال هر فیلتر jq استفاده شود.

مرتب سازی بر اساس (foo) دو عنصر را با مقایسه نتیجه مقایسه می کند فو روی هر عنصر

jq 'sort'
[8,3,null,6]
=> [null,3,6,8]

jq ´sort_by(.foo)´
[{"foo":4، "bar":10}، {"foo":3، "bar":100}، {"foo":2، "bar":1}]
=> [{"foo":2، "bar":1}، {"foo":3، "bar":100}، {"foo":4، "bar":10}]

group_by (path_expression)
group_by(.foo) یک آرایه را به عنوان ورودی می گیرد، عناصری را که یکسان هستند گروه بندی می کند .فو رشته
به آرایه های جداگانه تبدیل می شود و همه این آرایه ها را به عنوان عناصر یک آرایه بزرگتر تولید می کند.
مرتب شده بر اساس مقدار .فو رشته.

هر عبارت jq، نه فقط دسترسی فیلد، ممکن است به جای آن استفاده شود .فو. مرتب سازی
ترتیب همان است که در نوع عملکرد بالا

jq 'group_by(.foo)'
[{"foo":1، "bar":10}، {"foo":3، "bar":100}، {"foo":1، "bar":1}]
=> [[{"foo":1، "bar":10}، {"foo":1، "bar":1}]، [{"foo":3، "bar":100}]]

دقیقه حداکثر min_by (path_exp)، max_by (path_exp)
حداقل یا حداکثر عنصر آرایه ورودی را پیدا کنید.

La min_by (path_exp) و max_by (path_exp) توابع به شما این امکان را می دهند که یک مورد خاص را مشخص کنید
زمینه یا دارایی برای بررسی، به عنوان مثال min_by(.foo) شیء را با کوچکترین پیدا می کند فو
رشته.

jq 'min'
[5,4,2,7]
=> 2

jq ´max_by(.foo)´
[{"foo":1، "bar":14}، {"foo":2، "bar":3}]
=> {"foo":2، "bar":3}

منحصر بفرد، unique_by (path_exp)
La منحصر به فرد تابع یک آرایه را به عنوان ورودی می گیرد و آرایه ای از همان عناصر را تولید می کند
ترتیب مرتب شده، با حذف موارد تکراری.

La unique_by (path_exp) تابع تنها یک عنصر را برای هر مقدار به دست آمده توسط
اعمال استدلال آن را به عنوان ساختن یک آرایه با برداشتن یک عنصر از هر یک در نظر بگیرید
گروه تولید شده توسط گروه.

jq "بی نظیر".
[1,2,5,3,5,3,1,3]
=> [1,2,3,5،XNUMX،XNUMX،XNUMX]

jq 'unique_by(.foo)'
[{"foo": 1، "bar": 2}، {"foo": 1، "bar": 3}، {"foo": 4، "bar": 5}]
=> [{"foo": 1، "bar": 2}، {"foo": 4، "bar": 5}]

jq 'unique_by(length)'
["پخت"، "بیکن"، "گربه"، "سیکادا"، "مارچوبه"]
=> ["بیکن"، "درخت"، "مارچوبه"]

معکوس
این تابع یک آرایه را معکوس می کند.

jq 'معکوس'
[1,2,3,4]
=> [4,3,2,1،XNUMX،XNUMX،XNUMX]

حاوی (عنصر)
فیلتر حاوی (ب) اگر b به طور کامل در ورودی وجود داشته باشد، true تولید می کند. آ
رشته B در رشته A موجود است اگر B زیر رشته A باشد. یک آرایه B در یک رشته وجود دارد
یک آرایه A اگر همه عناصر در B در هر عنصری در A موجود باشد. یک شی B است
در صورتی که تمام مقادیر B در مقدار A با the موجود باشد
همان کلید فرض بر این است که همه انواع دیگر در صورت مساوی بودن در یکدیگر وجود دارند.

jq 'حاوی ("نوار")'
"فوبار"
=> درست است

jq حاوی (["baz"، "bar"]) است
["foobar"، "foobaz"، "blarp"]
=> درست است

jq حاوی (["bazzzzz"، "bar"]) است
["foobar"، "foobaz"، "blarp"]
=> نادرست

jq ´contains({foo: 12, bar: [{barp: 12}]})´
{"foo": 12، "bar":[1,2،12،{"barp":13، "blip":XNUMX}]}
=> درست است

jq ´contains({foo: 12, bar: [{barp: 15}]})´
{"foo": 12، "bar":[1,2،12،{"barp":13، "blip":XNUMX}]}
=> نادرست

شاخص ها
خروجی آرایه ای حاوی شاخص های موجود در . جایی که s رخ می دهد. ورودی ممکن است یک آرایه، در
در این صورت اگر s یک آرایه است پس خروجی شاخص ها همان هایی خواهد بود که همه عناصر در آن قرار دارند .
مطابقت با کسانی که از s.

jq 'شاخص‌ها(")، ")".
"a، b، cd، efg، hijk"
=> [3,7,12،XNUMX،XNUMX،XNUMX]

jq ´شاخص(1)'
[0,1,2,1,3,1,4]
=> [1,3,5،XNUMX،XNUMX،XNUMX]

jq 'شاخص‌ها([1,2])'
[0,1,2,3,1,4,2,5,1,2,6,7]
=> [1,8،XNUMX،XNUMX،XNUMX]

شاخص(ها)، شاخص(های)
خروجی شاخص اولین (شاخص) یا آخرین (rindex) وقوع s در ورودی

jq 'index(, ")'
"a، b، cd، efg، hijk"
=> 3

jq ´rindex(, ")´
"a، b، cd، efg، hijk"
=> 12

داخل
فیلتر داخل (ب) اگر ورودی به طور کامل در b قرار داشته باشد true تولید می کند. آی تی
است، اساسا، یک نسخه معکوس از شامل.

jq ´inside("foobar")".
"بار"
=> درست است

jq ´inside(["foobar"، "foobaz"، "blarp"])´
["باز"، "بار"]
=> درست است

jq ´inside(["foobar"، "foobaz"، "blarp"])´
["bazzzzz"، "bar"]
=> نادرست

jq ´inside({"foo": 12، "bar":[1,2،12،{"barp":13، "blip":XNUMX}]})´
{"foo": 12، "bar": [{"barp": 12}]}
=> درست است

jq ´inside({"foo": 12، "bar":[1,2،12،{"barp":13، "blip":XNUMX}]})´
{"foo": 12، "bar": [{"barp": 15}]}
=> نادرست

با (خیابان) شروع می شود
خروجی درست اگر . با آرگومان رشته داده شده شروع می شود.

jq ´[.[]|شروع با("foo")]'
["fo"، "foo"، "barfoo"، "foobar"، "barfoob"]
=> [نادرست، درست، نادرست، درست، نادرست]

endswith (خ)
خروجی درست اگر . با آرگومان رشته داده شده به پایان می رسد.

jq ´[.[]| endswith("foo")]'
["foobar"، "barfoo"]
=> [نادرست، درست]

ترکیبات، ترکیبات (n)
خروجی تمام ترکیبات عناصر آرایه در آرایه ورودی. اگر داده شود
استدلال n، تمام ترکیبات را خروجی می دهد n تکرارهای آرایه ورودی

jq 'ترکیبات'
[[1,2،3]، [4، XNUMX]]
=> [1، 3]، [1، 4]، [2، 3]، [2، 4]

jq ´ترکیب(2)'
[0، 1]
=> [0، 0]، [0، 1]، [1، 0]، [1، 1]

ltrimstr(خ)
ورودی خود را با حذف رشته پیشوند داده شده، در صورتی که با آن شروع شود، خروجی می دهد.

jq ´[.[]|ltrimstr("foo")]'
["fo"، "foo"، "barfoo"، "foobar"، "afoo"]
=> ["fo"،""، "barfoo"، "bar"، "afoo"]

rtrimstr(str)
ورودی خود را با حذف رشته پسوند داده شده، در صورتی که به آن ختم شود، خروجی می دهد.

jq ´[.[]|rtrimstr("foo")]'
["fo"، "foo"، "barfoo"، "foobar"، "foob"]
=> ["fo"،""، "نوار"، "foobar"، "foob"]

منفجر شدن
یک رشته ورودی را به آرایه ای از اعداد کد نقطه رشته تبدیل می کند.

jq 'انفجار'
"فوبار"
=> [102,111,111,98,97,114،XNUMX،XNUMX،XNUMX]

ادموند
معکوس انفجار.

jq 'implode'
[65، 66، 67]
=> "ABC"

انشعاب
یک رشته ورودی را در آرگومان جداکننده تقسیم می کند.

jq ´split(, ")´
"الف، ب، ج، د، ه،"
=> ["الف"، "ب، ج، د"، "ه"، ""]

پیوستن (خیابان)
با استفاده از آرگومان به عنوان جداکننده، به آرایه عناصر داده شده به عنوان ورودی می پیوندد. آن است
معکوس از انشعاب: یعنی دویدن تقسیم ("foo") | پیوستن ("foo") روی هر رشته ورودی
رشته ورودی گفته شده را برمی گرداند.

jq 'join(, ")'
["الف"، "ب، ج، د"، "ه"]
=> "a, b, c,d, e"

ascii_downcase، ascii_upcase
یک کپی از رشته ورودی با نویسه های الفبایی آن (az و AZ) تبدیل به ارسال کنید
مورد مشخص شده

while(cond; به روز رسانی)
La while(cond; به روز رسانی) تابع به شما امکان می دهد بارها و بارها یک به روز رسانی را اعمال کنید . تا مخلوط
نادرست است

توجه داشته باشید که while(cond; به روز رسانی) در داخل به عنوان یک تابع jq بازگشتی تعریف شده است. بازگشتی
در داخل تماس می گیرد در حین حافظه اضافی مصرف نمی کند اگر به روز رسانی حداکثر یک تولید می کند
خروجی برای هر ورودی موضوعات پیشرفته را در زیر مشاهده کنید.

jq ´[while(.<100; .*2)]´
1
=> [1,2,4,8,16,32,64،XNUMX،XNUMX،XNUMX]

تا(cond; بعد)
La تا(cond; بعد) تابع به شما اجازه می دهد تا به طور مکرر عبارت را اعمال کنید بعد,
در ابتدا به . سپس به خروجی خود، تا زمانی که مخلوط درست است. به عنوان مثال، می توان از این استفاده کرد
برای پیاده سازی یک تابع فاکتوریل (به زیر مراجعه کنید).

توجه داشته باشید که تا(cond; بعد) در داخل به عنوان یک تابع jq بازگشتی تعریف شده است. بازگشتی
در داخل تماس می گیرد تا زمان() حافظه اضافی مصرف نمی کند اگر بعد حداکثر یک تولید می کند
خروجی برای هر ورودی موضوعات پیشرفته را در زیر مشاهده کنید.

jq ´[.,1]|تا(.[0] < 1؛ [.[0] - 1، .[1] * .[0]])|.[1]´
4
=> 24

بازگشت (f)، عود، recurse(f; وضعیت)، recurse_down
La بازگشت (f) تابع به شما امکان می دهد در یک ساختار بازگشتی جستجو کرده و استخراج کنید
داده های جالب از همه سطوح فرض کنید ورودی شما یک فایل سیستم را نشان می دهد:

{"name": "/"، "فرزندان": [
{"نام": "/ صندوقچه"، "فرزندان": [
{"نام": "/bin/ls"، "فرزندان": []}،
{"نام": "/ بن / شل"، "فرزندان": []}]}،
{"نام": "/ صفحه اصلی"، "فرزندان": [
{"name": "/home/stephen", "children": [
{"name": "/home/stephen/jq"، "children": []}]}]}]}

حال فرض کنید می خواهید همه نام فایل های موجود را استخراج کنید. شما باید بازیابی کنید نام,
.کودکان[].نام, .فرزند[].فرزند[].نام، و غیره. شما می توانید این کار را با:

recurse(.children[]) | .نام

وقتی بدون استدلال فراخوانی می شود، پس گرفتن برابر است با بازگشت (.[]؟).

بازگشت (f) یکسان است با recurse(f; . != خالی) و بدون نگرانی قابل استفاده است
عمق بازگشت

recurse(f; وضعیت) یک مولد است که با انتشار شروع می شود. و سپس به نوبه خود ساطع می کند
.|f، .|f|f، .|f|f|f، ... تا زمانی که مقدار محاسبه شده شرط را برآورده کند. برای
به عنوان مثال، برای تولید همه اعداد صحیح، حداقل در اصل، می توان نوشت recurse(.+1;
درست است، واقعی).

به دلایل میراثی، recurse_down به عنوان نام مستعار برای فراخوانی وجود دارد پس گرفتن بدون استدلال
این نام مستعار در نظر گرفته شده است منسوخ و در نسخه اصلی بعدی حذف خواهد شد.

بازگشتی تماس می گیرد پس گرفتن هیچ وقت حافظه اضافی مصرف نمی کند f تولید می کند در
بیشتر یک خروجی واحد برای هر ورودی.

jq 'recurse(.foo[])'
{"foo":[{"foo": []}، {"foo":[{"foo":[]}]}]}
=> {"foo":[{"foo":[]}،{"foo":[{"foo":[]}]}]}، {"foo":[]}، {"foo": [{"foo":[]}]}، {"foo":[]}

jq 'recurse'
{"a":0,"b":[1]}
=> {"a":0,"b":[1]}، 0، [1]، 1

jq 'recurse(. * .; . < 20)'
2
=> 2، 4، 16

..
دست کوتاه برای پس گرفتن بدون استدلال این برای شباهت به XPath در نظر گرفته شده است //
اپراتور. توجه داشته باشید که ..آ کار نمی کند؛ استفاده کنید ..|الف بجای. در مثال زیر استفاده می کنیم
..|.a؟ برای یافتن تمام مقادیر کلیدهای شی "a" در هر شی "زیر" ..

jq ´..|.a?´
[[{"a":1}]]
=> 1

env
خروجی یک شی نشان دهنده محیط jq است.

jq 'env.PAGER'
تهی
=> "کمتر"

انتقال
یک ماتریس احتمالاً ناهموار (آرایه ای از آرایه ها) را جابجا کنید. سطرها با null ها پر شده اند تا
نتیجه همیشه مستطیل شکل است

jq 'transpose'
[[1]، [2,3،XNUMX]]
=> [[1,2،3]،[null،XNUMX]]

جستجو (x)
bsearch(x) یک جستجوی دودویی برای x در آرایه ورودی انجام می دهد. اگر ورودی مرتب شده باشد و
حاوی x است، سپس bsearch(x) ایندکس خود را در آرایه برمی گرداند. در غیر این صورت، اگر آرایه باشد
مرتب شده، برمی گردد (-1 - ix) که در آن ix یک نقطه درج است به طوری که آرایه
همچنان پس از درج x در ix مرتب شود. اگر آرایه مرتب نشده است، bsearch(x)
یک عدد صحیح را برمی گرداند که احتمالاً هیچ علاقه ای ندارد.

jq ´جستجو(0)'
[0,1]
=> 0

jq ´جستجو(0)'
[1,2,3]
=> -1

jq ´جستجو(4) به عنوان $ix | اگر $ix < 0 سپس .[-(1+$ix)] = 4 other . پایان
[1,2,3]
=> [1,2,3,4،XNUMX،XNUMX،XNUMX]

رشته درون یابی - \(فو)
در داخل یک رشته، می توانید یک عبارت را بعد از بک اسلش در داخل پرانتز قرار دهید. هر چه باشد
عبارات بازگشتی در رشته درون یابی خواهند شد.

jq ´"ورودی \(.) بود که یک کمتر از \(.+1)"' است
42
=> "ورودی 42 بود که یک کمتر از 43 است"

تبدیل به / از JSON
La توجسون و fromjson داخلی مقادیر را به عنوان متون JSON حذف می کند یا متون JSON را در آنها تجزیه می کند
ارزش ها به ترتیب توسترینگ توسترینگ با بازگشت توسترینگ تفاوت دارد
رشته ها اصلاح نشده اند، در حالی که tojson رشته ها را به عنوان رشته های JSON رمزگذاری می کند.

jq ´[.[]|tostring]´
[1، "فو"، ["فو"]]
=> ["1"، "foo"، "[\"foo\"]"]

jq ´[.[]|tojson]´
[1، "فو"، ["فو"]]
=> ["1"،"\"foo\""، "[\"foo\"]"]

jq ´[.[]|tojson|fromjson]´
[1، "فو"، ["فو"]]
=> [1"foo"،["foo"]]

قالب رشته های و فرار
La @foo سینتکس برای قالب بندی و فرار رشته ها استفاده می شود که برای ساخت URL ها مفید است.
اسناد به زبانی مانند HTML یا XML و غیره. @foo می توان از آن به عنوان فیلتر استفاده کرد
خود، گریزهای احتمالی عبارتند از:

@text:

تماس ها طناب زدن، برای جزئیات بیشتر به آن تابع مراجعه کنید.

@json:

ورودی را به صورت JSON سریال می کند.

@html:

با نقشه برداری از کاراکترها، فرار HTML/XML را اعمال می کند <>&'" به نهاد خود
معادل ها <, >, و, ", ".

uri:

با نگاشت همه کاراکترهای URI رزرو شده به a، کدگذاری درصد را اعمال می کند %XX توالی.

@csv:

ورودی باید یک آرایه باشد و به صورت CSV با دو نقل قول برای ارائه می شود
رشته ها و نقل قول ها با تکرار فرار کردند.

@tsv:

ورودی باید یک آرایه باشد و به صورت TSV (مقادیر جدا شده از تب) ارائه می شود. هر یک
آرایه ورودی به صورت یک خط چاپ می شود. فیلدها با یک برگه جدا می شوند
(ascii 0x09). کاراکترهای ورودی خط تغذیه (ascii 0x0a، کالسکه-بازگشت (ascii
0x0d، برگه (ascii 0x09) و بک اسلش (ascii 0x5c) به عنوان خروجی خروجی خواهد شد
توالی \n, \r, \t, \\ بود.

sh:

ورودی برای استفاده در خط فرمان برای پوسته POSIX مناسب است. اگر
ورودی یک آرایه است، خروجی مجموعه ای از رشته های جدا شده با فاصله خواهد بود.

@base64:

همانطور که توسط RFC 64 مشخص شده است، ورودی به base4648 تبدیل می شود.

این نحو را می توان با درون یابی رشته ای به روشی مفید ترکیب کرد. می توانید الف را دنبال کنید
@foo نشانه با یک رشته به معنای واقعی کلمه. محتویات رشته اراده تحت اللفظی نه فرار شود
با این حال، تمام درون یابی های انجام شده در داخل آن رشته به معنای واقعی کلمه فرار می کند. برای مثال،

@uri "https://www.google.com/search?q=\(.search)"

خروجی زیر را برای ورودی تولید می کند {"search":"چه is jq؟"}:

"https://www.google.com/search?q=what%20is%20jq%3F"

توجه داشته باشید که اسلش ها، علامت سوال و غیره در URL حذف نمی شوند، زیرا بخشی بودند
از رشته به معنای واقعی کلمه.

jq '@html'
"اگر x < y کار می کند"
=> "اگر x < y کار می کند"

jq ´@sh "echo \(.)"'
"O'Hara's Ale"
=> "echo 'O'\\'Hara'\\''s Ale""

تاریخ
jq برخی از عملکردهای اولیه رسیدگی به تاریخ را با برخی از سطوح بالا و پایین ارائه می دهد
ساخته شده در همه موارد این بیلدین ها منحصراً با زمان در UTC سروکار دارند.

La fromdateiso8601 داخلی زمان تاریخ را در قالب ISO 8601 تا چند ثانیه تجزیه می کند
از دوران یونیکس (1970-01-01T00:00:00Z). در todateiso8601 ساخته شده معکوس را انجام می دهد.

La از تاریخ داخلی رشته های تاریخ را تجزیه می کند. در حال حاضر از تاریخ فقط ISO 8601 را پشتیبانی می کند
رشته های datetime، اما در آینده تلاش خواهد کرد تا رشته های datetime را در تعداد بیشتری تجزیه کند
فرمت.

La به روز buildin نام مستعار برای است todateiso8601.

La اکنون داخلی زمان فعلی را در چند ثانیه از زمان یونیکس به نمایش می گذارد.

رابط های jq سطح پایین برای توابع زمان کتابخانه C نیز ارائه شده است: strptime,
زمان صرف وقت, mktimeو gmtime. برای این کار به اسناد سیستم عامل میزبان خود مراجعه کنید
رشته های قالب استفاده شده توسط strptime و زمان صرف وقت. توجه: اینها لزوماً پایدار نیستند
رابط ها در jq، به ویژه در مورد عملکرد محلی سازی آنها.

La gmtime داخلی از زمان یونیکس چند ثانیه مصرف می کند و یک "broken" را خروجی می دهد
زمان پایین" نمایش زمان به عنوان آرایه ای از اعداد نشان دهنده (به این ترتیب): the
سال، ماه (بر اساس صفر)، روز ماه، ساعت روز، دقیقه
ساعت، ثانیه دقیقه، روز هفته، و روز سال -- همه
تک پایه مگر اینکه خلاف آن ذکر شده باشد.

La mktime ساختار داخلی نمایش‌های «زمان شکسته» از زمان خروجی را مصرف می‌کند gmtime
و strptime.

La strptime(fmt) داخلی رشته های ورودی مطابق با fmt بحث و جدل. خروجی در است
نمایش "زمان شکسته" مصرف شده توسط gmtime و خروجی توسط mktime.

La strftime(fmt) فرمت های داخلی زمان با فرمت داده شده.

رشته های قالب برای strptime و زمان صرف وقت در کتابخانه معمولی C توضیح داده شده است
مستندات. رشته قالب برای تاریخ تاریخ ISO 8601 است "%Y-%m-%dT%H:%M:%SZ".

jq ممکن است برخی یا همه این قابلیت تاریخ را در برخی از سیستم ها پشتیبانی نکند.

jq 'fromdate'
"2015-03-05T23:51:47Z"
=> 1425599507

jq ´strptime("%Y-%m-%dT%H:%M:%SZ")'
"2015-03-05T23:51:47Z"
=> [2015,2,5,23,51,47,4,63،XNUMX،XNUMX،XNUMX]

jq ´strptime("%Y-%m-%dT%H:%M:%SZ")|mktime'
"2015-03-05T23:51:47Z"
=> 1425599507

شرایط و مقایسه ها


==، !=
اگر نتیجه a و b برابر باشند، عبارت «a == b» «true» را تولید می‌کند (یعنی
اگر آنها اسناد JSON معادل را نشان می دهند) و در غیر این صورت 'false'. به ویژه رشته ها
هرگز برابر اعداد در نظر گرفته نمی شوند. اگر از جاوا اسکریپت می آیید، jq´s == مانند است
=== جاوا اسکریپت - در نظر گرفتن مقادیر برابر فقط زمانی که دارای یک نوع باشند و همچنین
همان مقدار

!= "مساوی نیست" است و ´a != b´ مقدار مخالف ´a == b´ را برمی گرداند.

jq ´.[] == 1´
[1، 1.0، "1"، "موز"]
=> درست، درست، نادرست، نادرست

اگر-پس-جای دیگر
if A سپس B دیگر C پایان همانند عمل خواهد کرد B if A مقداری غیر از false or تولید می کند
تهی است، اما مانند آن عمل کنید C در غیر این صورت.

بررسی false یا null مفهومی ساده‌تر از "حقیقت" نسبت به جاوا اسکریپت است
یا Python، اما به این معنی است که گاهی اوقات باید در مورد شرایط صریح تر صحبت کنید
شما می خواهید: نمی توانید آزمایش کنید که آیا یک رشته خالی است یا خیر if نام سپس A دیگر B پایان,
شما به چیزی شبیه تر نیاز خواهید داشت if (.نام | طول) > 0 سپس A دیگر B پایان به جای آن.

اگر شرط A نتایج متعددی را ایجاد کند، در صورت وجود هر یک از آنها، "درست" در نظر گرفته می شود
نتایج نادرست یا پوچ نیست. اگر نتیجه صفر باشد، نادرست در نظر گرفته می شود.

موارد بیشتری را می توان به یک در صورت استفاده اضافه کرد الیف A سپس B نحو.

jq «اگر. == 0 سپس

الیف "صفر". == 1 سپس "one" دیگری "بسیاری" پایان´ 2 => "بسیاری"

>, >=، <=، <
عملگرهای مقایسه >, >=, <=, < آیا آرگومان سمت چپ آنها بزرگتر از
بزرگتر یا مساوی، کمتر یا مساوی یا کمتر از استدلال درست آنها
(به ترتیب).

سفارش همان چیزی است که برای آن توضیح داده شده است نوع، در بالا.

jq ´. < 5'
2
=> درست است

و/یا/نه
jq از عملگرهای معمولی بولی و/یا/نه پشتیبانی می کند. آنها همان معیار حقیقت را دارند
گویی عبارات - false و null "مقدار نادرست" در نظر گرفته می شوند و هر چیز دیگری a است
"ارزش واقعی".

اگر عملوند یکی از این عملگرها چندین نتیجه تولید کند، خود عملگر
برای هر ورودی نتیجه ای ایجاد خواهد کرد.

نه در واقع یک تابع داخلی است تا یک عملگر، بنابراین به عنوان یک فیلتر برای نامیده می شود
که چیزها را می توان لوله کرد نه با نحو خاص، مانند .فو و .بار | نه.

این سه فقط مقادیر "درست" و "نادرست" را تولید می کنند و بنابراین فقط برای واقعی مفید هستند
عملیات بولی، به جای اصطلاح رایج Perl/Python/Ruby
"value_that_may_be_null or default." اگر می‌خواهید از این شکل «یا» استفاده کنید، از بین آن‌ها انتخاب کنید
دو مقدار به جای ارزیابی یک شرط، عملگر "//" را در زیر ببینید.

jq ´42 و «یک رشته»´
تهی
=> درست است

jq '(درست، نادرست) یا نادرست'
تهی
=> درست، نادرست

jq '(درست، درست) و (درست، نادرست)'
تهی
=> درست، نادرست، درست، نادرست

jq '[درست، نادرست | نه]'
تهی
=> [نادرست، درست]

دیگر اپراتور - //
فیلتر فرم a // b همان نتایج را ایجاد می کند a، اگر a نتایج دیگری ایجاد می کند
نسبت به غلط و تهی. در غیر این صورت، a // b همان نتایج را ایجاد می کند b.

این برای ارائه پیش فرض ها مفید است: .فو // 1 ارزیابی خواهد کرد 1 اگر وجود ندارد .فو
عنصر در ورودی شبیه چگونه است or گاهی اوقات در پایتون (jq´s or اپراتور
برای عملیات کاملاً بولی رزرو شده است).

jq ´.foo // 42´
{"foo": 19}
=> 19

jq ´.foo // 42´
{}
=> 42

امتحان کردن
خطاها را می توان با استفاده از امتحان EXP گرفتن EXP. اولین عبارت اجرا می شود و if
شکست می خورد سپس دومی با پیغام خطا اجرا می شود. خروجی هندلر، اگر
any، طوری خروجی است که گویی خروجی عبارتی است که باید امتحان کنید.

La امتحان EXP استفاده از فرم خالی به عنوان کنترل کننده استثنا

jq ´try .a catch ". is not a object"´
درست
=> ". یک شی نیست"

jq ´[.[]| سعی کنید .a]´
[{}، درست، {"a":1}]
=> [تهی، 1]

jq ´sry error ("some استثنا") catch .'
درست
=> "بعضی استثنا"

شکستن خارج of کنترل ساختار
یک استفاده راحت از try/catch خارج شدن از ساختارهای کنترلی مانند كاهش دادن, برای هر,
در حین، و غیره.

مثلا:

# یک عبارت را تکرار کنید تا زمانی که "شکست" را به عنوان یک افزایش دهد
# خطا، سپس تکرار را بدون بالا بردن مجدد خطا متوقف کنید.
# اما اگر خطای ثبت شده "شکست" نیست، آن را دوباره مطرح کنید.
سعی کنید تکرار (exp) catch .=="شکستن" و سپس خالی کردن خطای else;

jq یک نحو برای برچسب‌های واژگانی نام‌گذاری شده برای "شکستن" یا "برگشت (بازگشت) به" دارد:

برچسب $out | ... شکستن دلار ...

La شکستن $label_name عبارت باعث می شود که برنامه به گونه ای عمل کند که گویی نزدیکترین است
(به سمت چپ) برچسب $label_name ساخته خالی.

رابطه بین شکستن و مربوطه برچسب واژگانی است: برچسب باید باشد
"قابل مشاهده" از شکست.

بیرون آمدن از الف كاهش دادن، مثلا:

برچسب $out | .[] را به عنوان $item کاهش دهید (null؛ اگر .==نادرست است، $out else ... end را بشکنید)

برنامه jq زیر یک خطای نحوی ایجاد می کند:

شکستن $

چون بدون برچسب $ بیرون قابل مشاهده است

? اپراتور
La ? اپراتور، به عنوان استفاده می شود انقضا؟، مخفف است امتحان EXP.

jq ´[.[]|(.a)؟]´
[{}، درست، {"a":1}]
=> [تهی، 1]

منظم اصطلاحات (PCRE)


jq از کتابخانه عبارات منظم Oniguruma استفاده می کند، مانند php، ruby، TextMate، Sublime Text،
و غیره، بنابراین توضیحات در اینجا بر روی مشخصات jq متمرکز خواهد شد.

فیلترهای jq regex به گونه ای تعریف شده اند که می توان از یکی از این الگوها استفاده کرد:

STRING | FILTER ( REGEX )
STRING | FILTER(REGEX; FLAGS)
STRING | فیلتر ([REGEX])
STRING | فیلتر ([REGEX، FLAGS])

که در آن: * STRING، REGEX و FLAGS رشته های jq هستند و مشمول درون یابی رشته های jq هستند. *
REGEX، پس از درونیابی رشته، باید یک regex معتبر PCRE باشد. * FILTER یکی از آزمون,
همخوانی داشتن، یا گرفتن، به شرح زیر.

FLAGS رشته ای است که از یکی از پرچم های پشتیبانی شده بیشتر تشکیل شده است:

· g - جستجوی جهانی (همه موارد منطبق را پیدا کنید، نه فقط اولین)

· i - جستجوی غیر حساس به حروف کوچک

· m - حالت چند خطی (´.´ با خطوط جدید مطابقت دارد)

· n - مسابقات خالی را نادیده بگیرید

· p - هر دو حالت s و m فعال هستند

· s - حالت تک خطی (´^´ -> ´\A´, ´$´ -> ´\Z´)

· l - طولانی ترین مسابقات ممکن را پیدا کنید

· x - فرمت regex گسترده (از فضای خالی و نظرات صرف نظر کنید)

برای تطبیق فضای سفید در الگوی x از یک escape مانند \s استفاده کنید، به عنوان مثال

· تست ("a\sb"، "x").

توجه داشته باشید که پرچم‌های خاصی نیز ممکن است در REGEX مشخص شوند، به عنوان مثال

· jq -n´("تست"، "تست"، "تست"، "تست") | test("(?i)te(?-i)st")´

به: درست، درست، نادرست، نادرست ارزیابی می کند.

[نیاز دارد 1.5] تست (val) test(regex; پرچم ها)
پسندیدن همخوانی داشتن، اما فقط اشیاء مطابق را بر نمی گرداند درست or غلط برای اینکه آیا
regex با ورودی مطابقت دارد.

jq ´test("foo")".
"فو"
=> درست است

jq ´.[] | test("فضاهای abc# نادیده گرفته می شوند"؛ "ix")´
["xabcd"، "ABC"]
=> درست، درست است

[نیاز دارد 1.5] مسابقه (val), مطابقت(regex; پرچم ها)
همخوانی داشتن برای هر مسابقه ای که پیدا می کند یک شی را خروجی می دهد. مسابقات دارای فیلدهای زیر است:

· چاپ افست - در کدهای UTF-8 از ابتدای ورودی جابجا می شود

· طول - طول در کدهای UTF-8 مسابقه

· رشته - رشته ای که مطابقت داشت

· جلب - آرایه ای از اشیاء نشان دهنده گروه های گرفتن.

گرفتن اشیاء گروه دارای فیلدهای زیر است:

· چاپ افست - در کدهای UTF-8 از ابتدای ورودی جابجا می شود

· طول - طول در کد UTF-8 این گروه تصویربرداری

· رشته - رشته ای که اسیر شد

· نام - نام گروه تسخیر کننده (یا تهی اگر بی نام بود)

گرفتن گروه هایی که با چیزی مطابقت نداشتند، یک افست -1 را به دست می دهند

jq ´match("(abc)+"؛ "g")´
"abc abc"
=> {"offset": 0، "length": 3، "string": "abc"، "captures": [{"offset": 0، "length": 3، "string": "abc"، " name": null}]}، {"offset": 4، "length": 3، "string": "abc"، "captures": [{"offset": 4، "length": 3، "string" : "abc"، "name": null}]}

jq ´match("foo")".
"فو بار فو"
=> {"offset": 0، "length": 3، "string": "foo"، "captures": []}

jq ´match(["foo"، "ig"])'
"فو بار FOO"
=> {"offset": 0، "length": 3، "string": "foo"، "captures": []}، {"offset": 8، "length": 3، "string": "FOO" "، "captures": []}

jq ´match("foo (? بار)؟ foo"؛ "ig")´
"فو بار فو فو فو"
=> {"offset": 0، "length": 11، "string": "foo bar foo"، "captures": [{"offset": 4، "length": 3، "string": "bar" , "name": "bar123"}]}، {"offset": 12، "length": 8، "string": "foo foo"، "captures": [{"offset": -1، "length" : 0، "string": null، "name": "bar123"}]}

jq ´[ مطابقت("."؛ "g")] | طول
"abc"
=> 3

[نیاز دارد 1.5] گرفتن (val), گرفتن(regex; پرچم ها)
عکس‌های نام‌گذاری شده را در یک شی JSON جمع‌آوری می‌کند، با نام هر عکس به عنوان کلید،
و رشته همسان به عنوان مقدار مربوطه.

jq ´capture("(? [az]+)-(? [0-9]+)")´
"xyzzy-14"
=> { "a": "xyzzy"، "n": "14" }

[نیاز دارد 1.5] اسکن (رجکس)، اسکن (regex; پرچم ها)
جریانی از رشته های فرعی غیر همپوشانی ورودی که با regex در مطابقت دارند منتشر کنید
مطابق با پرچم ها، در صورتی که مشخص شده باشد. اگر مطابقت وجود نداشته باشد، جریان است
خالی. برای گرفتن همه موارد منطبق برای هر رشته ورودی، از اصطلاح استفاده کنید [ صادرات ]، به عنوان مثال [
اسکن (Regex) ].

split(regex; پرچم ها)
برای سازگاری به عقب، انشعاب بر روی یک رشته تقسیم می شود، نه یک regex.

[نیاز دارد 1.5] اسپلیت (رجکس)، splits(regex; پرچم ها)
اینها همان نتایج را ارائه می دهند انشعاب همتایان، اما به عنوان یک جریان به جای یک
آرایه.

[نیاز دارد 1.5] sub(regex; توسترینگ) sub(regex; رشته؛ پرچم ها)
رشته ای را که با جایگزین کردن اولین تطابق regex در رشته ورودی به دست می آید، منتشر کنید
طناب زدن، پس از درون یابی. طناب زدن باید یک رشته jq باشد و ممکن است حاوی ارجاع باشد
به ضبط های نامگذاری شده عکس‌های نام‌گذاری شده، در واقع به عنوان یک شی JSON ارائه می‌شوند (مانند
ساخته شده توسط گرفتن) به طناب زدن، بنابراین ارجاع به یک متغیر ضبط شده به نام "x" خواهد بود
به شکل: "(.x)".

[نیاز دارد 1.5] gsub(regex; رشته)، gsub(regex; رشته؛ پرچم ها)
gsub مثل این است زیر اما تمام رخدادهای غیر همپوشانی regex با علامت جایگزین می شوند
رشته، پس از درون یابی.

ADVANCED ویژگی‌ها


متغیرها در اکثر زبان‌های برنامه‌نویسی یک ضرورت مطلق هستند، اما از بین رفته‌اند
به یک "ویژگی پیشرفته" در jq.

در بیشتر زبان ها، متغیرها تنها وسیله انتقال داده ها هستند. اگر الف را محاسبه کنید
مقدار، و می خواهید بیش از یک بار از آن استفاده کنید، باید آن را در یک متغیر ذخیره کنید. به
یک مقدار را به قسمت دیگری از برنامه ارسال کنید، به آن قسمت از برنامه نیاز دارید
یک متغیر (به عنوان پارامتر تابع، عضو شی یا هر چیز دیگری) که در آن قرار گیرد را تعریف کنید
داده.

همچنین می توان توابع را در jq تعریف کرد، اگرچه این یکی از ویژگی هایی است که بزرگترین آن است
استفاده از آن تعریف کتابخانه استاندارد jq است (بسیاری از توابع jq مانند نقشه و پیدا کردن در واقع هستند
نوشته شده در jq).

jq دارای عملگرهای کاهش است که بسیار قدرتمند هستند اما کمی مشکل هستند. باز هم اینها هستند
بیشتر به صورت داخلی برای تعریف چند بیت مفید از کتابخانه استاندارد jq استفاده می شود.

ممکن است در ابتدا واضح نباشد، اما jq همه چیز در مورد ژنراتورها است (بله، همانطور که اغلب در آنها یافت می شود
زبان های دیگر). برخی از ابزارهای کمکی برای کمک به مقابله با ژنراتورها ارائه شده است.

حداقل پشتیبانی I/O (علاوه بر خواندن JSON از ورودی استاندارد و نوشتن JSON در
خروجی استاندارد) در دسترس است.

در نهایت، یک سیستم ماژول/کتابخانه وجود دارد.

متغیر
در jq همه فیلترها یک ورودی و یک خروجی دارند، بنابراین لوله کشی دستی لازم نیست
یک مقدار را از یک قسمت برنامه به قسمت بعدی منتقل کنید. به عنوان مثال، بسیاری از عبارات a + b,
ورودی خود را به دو عبارت فرعی مجزا ارسال کنید (اینجا a و b هر دو یکسان پاس می شوند
ورودی)، بنابراین معمولاً متغیرها برای استفاده دوبار از یک مقدار ضروری نیستند.

به عنوان مثال، محاسبه مقدار متوسط ​​یک آرایه از اعداد به تعداد کمی نیاز دارد
متغیرها در اکثر زبان ها - حداقل یکی برای نگه داشتن آرایه، شاید یکی برای هر عنصر
یا برای یک شمارنده حلقه. در jq، به سادگی است اضافه کردن / طول - اضافه کردن بیان داده می شود
آرایه و حاصل جمع آن، و طول عبارت به آرایه داده می شود و آن را تولید می کند
طول

بنابراین، به طور کلی یک راه تمیزتر برای حل اکثر مشکلات در jq نسبت به تعریف متغیرها وجود دارد.
با این حال، گاهی اوقات آنها کار را آسان تر می کنند، بنابراین jq به شما امکان می دهد متغیرها را با استفاده از آن تعریف کنید
بیان as متغیر $. نام همه متغیرها با شروع می شود $. این یک نسخه کمی زشت تر است
از مثال میانگین آرایه:

طول به عنوان $array_length | افزودن / $array_length

برای یافتن موقعیتی که در آن واقعاً از متغیرها استفاده کنیم، به یک مسئله پیچیده‌تر نیاز داریم
زندگی ما را آسان تر می کند

فرض کنید آرایه‌ای از پست‌های وبلاگ داریم، با فیلدهای «نویسنده» و «عنوان» و دیگری
شی که برای نگاشت نام کاربری نویسنده به نام واقعی استفاده می شود. ورودی ما به نظر می رسد:

{"posts": [{"title": "Frist psot"، "author": "anon"},
{"title": "یک مقاله خوش نوشته"، "نویسنده": "person1"}],
"realnames": {"anon": "بزدل ناشناس"،
"person1": "Person McPherson"}}

ما می خواهیم پست ها را با فیلد نویسنده حاوی نام واقعی تولید کنیم، مانند:

{"title": "Frist psot"، "نویسنده": "Biros ناشناس"}
{"title": "یک مقاله خوش نوشته"، "نویسنده": "Person McPherson"}

ما از یک متغیر $names برای ذخیره شی realnames استفاده می کنیم تا بتوانیم بعداً به آن مراجعه کنیم
هنگام جستجوی نام کاربری نویسنده:

.realnames به عنوان $names | پست‌ها[] | {title، نویسنده: $names[.author]}

عبارت درصد این سطح as $x | ... معنی: برای هر مقدار از عبارت درصد این سطح، بقیه را اجرا کنید
خط لوله با کل ورودی اصلی و با $x روی آن مقدار تنظیم کنید. بدین ترتیب as
به عنوان چیزی شبیه یک حلقه foreach عمل می کند.

فقط به عنوان {foo} یک روش مفید برای نوشتن است {foo: .foo}، به طوری که {$foo} یک روش مفید برای نوشتن است
{foo:$foo}.

متغیرهای متعدد ممکن است با استفاده از یک واحد اعلام شوند as بیان با ارائه یک الگو
که با ساختار ورودی مطابقت دارد (این به عنوان "تخریب کننده" شناخته می شود):

. به عنوان {realnames: $names, posts: [$first, $second]} | ...

اعلان متغیرها در الگوهای آرایه (به عنوان مثال، . as [$ first، $ثانیه]) به
عناصر آرایه به ترتیب از عنصر در اندیس صفر به بالا وارد می شوند. وقتی وجود ندارد
مقدار در شاخص برای عنصر الگوی آرایه، تهی به آن متغیر مقید است.

متغیرها بر روی بقیه عبارتی که آنها را تعریف می کند محدوده می شوند، بنابراین

.realnames به عنوان $names | (.posts[] | {title، نویسنده: $names[.author]})

کار خواهد کرد، اما

(. realnames به عنوان $names | .posts[]) | {title، نویسنده: $names[.author]}

نمی خواهد.

برای نظریه پردازان زبان برنامه نویسی، دقیق تر است که بگوییم متغیرهای jq هستند
صحافی با دامنه واژگانی به طور خاص هیچ راهی برای تغییر ارزش یک اتصال وجود ندارد.
فقط می توان یک اتصال جدید با همین نام تنظیم کرد، اما در کجا قابل مشاهده نخواهد بود
قدیمی بود

jq ´.bar به عنوان $x | .foo | . +$x´
{"foo":10, "bar":200}
=> 210

jq ´. به عنوان $i|[(.*2|. به عنوان $i| $i)، $i]´
5
=> [10,5،XNUMX،XNUMX،XNUMX]

jq ´. به عنوان [$a، $b، {c: $c}] | $a + $b + $c´
[2، 3، {"c": 4، "d": 5}]
=> 9

jq ´.[] به عنوان [$a, $b] | {a: $a, b: $b}´
[[0]، [0، 1]، [2، 1، 0]]
=> {"a":0,"b":null}، {"a":0,"b":1}، {"a":2,"b":1}

تعریف کردن توابع
می توانید با استفاده از نحو "def" به یک فیلتر یک نام بدهید:

افزایش def: . + 1;

از آن پس، افزایش به عنوان یک فیلتر درست مانند یک تابع داخلی قابل استفاده است (در واقع، این
این است که چگونه برخی از ساخته شده تعریف شده است). یک تابع ممکن است آرگومان هایی داشته باشد:

نقشه (f): [.[] | f]؛

آرگومان ها به عنوان فیلتر ارسال می شوند، نه به عنوان مقادیر. ممکن است به همان استدلال ارجاع داده شود
چندین بار با ورودی های مختلف (اینجا f برای هر عنصر از آرایه ورودی اجرا می شود).
آرگومان های یک تابع بیشتر شبیه به callback عمل می کنند تا مانند آرگومان های مقدار. این هست
مهم برای درک در نظر گرفتن:

def foo(f): f|f;
5|فو(.*2)

نتیجه 20 خواهد بود زیرا f is .*2، و در طول اولین فراخوانی از f . 5 خواهد بود،
و بار دوم 10 خواهد بود (5 * 2)، بنابراین نتیجه 20 خواهد بود. آرگومان های تابع
فیلتر هستند و فیلترها هنگام فراخوانی انتظار ورودی دارند.

اگر رفتار آرگومان ارزش را برای تعریف توابع ساده می‌خواهید، فقط می‌توانید از a استفاده کنید
متغیر:

def addvalue(f): f به عنوان $f | map(. + $f);

یا از دست کوتاه استفاده کنید:

def addvalue($f): ...;

با هر دو تعریف، افزودن ارزش (.foo) ورودی های فعلی را اضافه می کند .فو زمینه به هر کدام
عنصر آرایه

تعاریف چندگانه با استفاده از نام تابع یکسان مجاز است. هر تعریف مجدد جایگزین می شود
قبلی برای همان تعداد آرگومان تابع، اما فقط برای ارجاعات از
توابع (یا برنامه اصلی) پس از تعریف مجدد.

jq ´def addvalue(f): . + [f]؛ map(addvalue(.[0]))´
[[1,2،10,20،XNUMX] ، [XNUMX]]
=> [[1,2,1،10,20,10،XNUMX]، [XNUMX،XNUMX،XNUMX]]

jq ´def addvalue(f): f به عنوان $x | نقشه (. + $x); addvalue(.[0])´
[[1,2،10,20،XNUMX] ، [XNUMX]]
=> [[1,2,1,2،10,20,1,2،XNUMX]، [XNUMX،XNUMX،XNUMX]]

کاستن
La كاهش دادن نحو در jq به شما امکان می دهد تمام نتایج یک عبارت را با هم ترکیب کنید
جمع آوری آنها در یک پاسخ واحد. به عنوان مثال، ما عبور خواهیم کرد [3,2,1] در این
اصطلاح:

کاهش .[] به عنوان $item (0; . + $item)

برای هر نتیجه ای که .[] تولید می کند، . + آیتم $ برای جمع آوری کل در حال اجرا اجرا می شود،
شروع از 0. در این مثال، .[] نتایج 3، 2 و 1 را ایجاد می کند، بنابراین اثر این است
شبیه به اجرای چیزی شبیه به این:

0 | (3 به عنوان $item | . + $item) |
(2 به عنوان $item | . + $item) |
(1 به عنوان $item | . + $item)

jq '.[] را به عنوان $item (0; . + $item) کاهش دهید
[10,2,5,3]
=> 20

limit(n; توسعه)
La محدود کردن تابع استخراج تا n خروجی از درصد این سطح.

jq '[Limit(3;.[])]'
[0,1,2,3,4,5,6,7,8,9]
=> [0,1,2،XNUMX،XNUMX،XNUMX]

اول (expr) آخرین (expr) nth(n; expr)
La اول (expr) و آخرین (expr) توابع اولین و آخرین مقادیر را از آن استخراج می کنند صادرات,
بود.

La nth(n; expr) تابع nامین مقدار خروجی را استخراج می کند صادرات. این را می توان به عنوان تعریف کرد
دف nth(n; expr): آخرین(حد + 1; expr)). توجه داشته باشید که nth(n; expr) پشتیبانی نمی کند
مقادیر منفی از n.

jq ´[اولین(محدوده(.))، آخرین(محدوده(.))، nth(./2؛ محدوده(.))]"
10
=> [0,9,5،XNUMX،XNUMX،XNUMX]

اولین، آخر، nامین (n)
La اول و آخر توابع اولین و آخرین مقادیر را از هر آرایه ای استخراج می کنند ..

La nامین (n) تابع مقدار n ام هر آرایه را استخراج می کند ..

jq '[محدوده(.)]|[اول، آخرین، چهارم(5)]'
10
=> [0,9,5،XNUMX،XNUMX،XNUMX]

برای هر
La برای هر نحو مشابه است كاهش دادن، اما در نظر گرفته شده تا اجازه ساخت و ساز را بدهد محدود کردن
و کاهنده هایی که نتایج میانی تولید می کنند (به مثال مراجعه کنید).

فرم است برای هر EXP as $var (INIT; به روز رسانی؛ استخراج کردن). مانند كاهش دادن, INIT ارزیابی می شود
یک بار برای تولید یک مقدار حالت، سپس هر خروجی از EXP مقید است $var, بروزرسانی is
برای هر خروجی ارزیابی می شود EXP با وضعیت فعلی و با $var قابل رویت. هر مقدار
خروجی توسط بروزرسانی جایگزین حالت قبلی می شود. سرانجام، استخراج کردن برای هر جدید ارزیابی می شود
حالت برای استخراج خروجی از برای هر.

این بیشتر فقط برای ساختن مفید است كاهش دادن- و محدود کردنتوابع مانند اما آن است
بسیار کلی تر، زیرا امکان کاهش جزئی را فراهم می کند (به مثال زیر مراجعه کنید).

jq '[foreach .[] به‌عنوان $item ([[]،[]]؛ اگر $item == خالی باشد، [[]،.[0]] other [(.[0] + [$item])،[ ]] پایان؛ اگر $item == null باشد، سپس .[1] else پایان خالی)]´
[1,2,3,4،XNUMX،XNUMX،XNUMX، تهی، «a»، «b»، تهی]
=> [[1,2,3,4،XNUMX،XNUMX،XNUMX]، ["a"، "b"]]

باز گشت
همانطور که در بالا توضیح داده شد ، پس گرفتن از بازگشت استفاده می کند و هر تابع jq می تواند بازگشتی باشد. در
در حین buldin از نظر بازگشت نیز پیاده سازی شده است.

هر زمان که عبارت سمت چپ خروجی تماس بازگشتی باشد، تماس‌های دنباله بهینه می‌شوند
آخرین مقدار آن در عمل این بدان معنی است که عبارت سمت چپ بازگشتی
تماس نباید بیش از یک خروجی برای هر ورودی تولید کند.

مثلا:

def recurse(f): def r: ., (f | select(. != null) | r); r;

def while(cond; update):
def _while:
if cond then ., (به روز رسانی | _while) else پایان خالی;
_در حالی که؛

تکرار def(exp):
def _repeat:
exp, _repeat;
_تکرار؛

ژنراتور و تکرار کننده ها
برخی از عملگرها و توابع jq در واقع مولدهایی هستند که می توانند صفر تولید کنند.
یک یا چند مقدار برای هر ورودی، درست همانطور که در برنامه نویسی دیگر انتظار می رود
زبان هایی که مولد دارند. مثلا، .[] تمام مقادیر ورودی خود را تولید می کند
(که باید یک آرایه یا یک شی باشد) محدوده(0; 10) اعداد صحیح بین 0 و را تولید می کند
10 ، و غیره

حتی عملگر کاما نیز یک مولد است که ابتدا مقادیر تولید شده توسط آن را ایجاد می کند
عبارت در سمت چپ کاما، سپس برای هر یک از آنها، مقادیر توسط the ایجاد می شود
عبارت سمت راست کاما

La خالی داخلی ژنراتوری است که خروجی صفر تولید می کند. در خالی خانه
به عبارت مولد قبلی برمی گردد.

تمام توابع jq می توانند فقط با استفاده از ژنراتورهای داخلی، مولد شوند. همچنین امکان پذیر است
برای تعریف مولدهای جدید فقط با استفاده از بازگشت و عملگر کاما. اگر بازگشتی
فراخوانی (ها) "در موقعیت دم" هستند، سپس ژنراتور کارآمد خواهد بود. در مثال
زیر تماس بازگشتی توسط _دامنه به خودش در موقعیت دم است. مثال خود را نشان می دهد
سه مبحث پیشرفته: بازگشت دم، ساخت ژنراتور، و توابع فرعی.

jq 'def range(init; upto; by): def _range: if (by > 0 and . < upto) یا (by < 0 and . > upto) سپس ., ((.+by)|_range) other . پایان؛ اگر با == 0 سپس init else init|_range end | select((توسط > 0 و . < تا) یا (با < 0 و . > تا)); محدوده (0; 10; 3)´
تهی
=> 0، 3، 6، 9

jq ´def while(cond; update): def _while: if cond then ., (به روز رسانی | _while) else پایان خالی; _در حالی که؛ [در حالی که(.<100; .*2)]´
1
=> [1,2,4,8,16,32,64،XNUMX،XNUMX،XNUMX]

ریاضی


jq در حال حاضر فقط از شماره ممیز شناور با دقت دوگانه (754 بیتی) IEEE64 پشتیبانی می کند.

علاوه بر عملگرهای ساده حسابی مانند +jq همچنین دارای اکثر توابع ریاضی استاندارد است
از کتابخانه ریاضی C. توابع ریاضی C که یک آرگومان ورودی واحد می گیرند (به عنوان مثال، گناه ())
به عنوان توابع jq با آرگومان صفر در دسترس هستند. C توابع ریاضی که دو ورودی می گیرند
استدلال ها (مثلا قدرت ()) به عنوان توابع jq دو آرگومان که نادیده می گیرند در دسترس هستند ..

در دسترس بودن توابع ریاضی استاندارد به در دسترس بودن توابع مربوطه بستگی دارد
توابع ریاضی در سیستم عامل شما و کتابخانه ریاضی C. توابع ریاضی در دسترس نیست
تعریف خواهد شد اما یک خطا ایجاد می کند.

I / O


در این زمان jq حداقل پشتیبانی از I/O را دارد، عمدتاً به صورت کنترل بر روی زمان
ورودی ها خوانده می شوند دو توابع داخلی برای این ارائه شده است، ورودی و ورودی، که خوانده شود
از همان منابع (مثلاً stdin، فایل هایی که در خط فرمان نامگذاری شده اند) به عنوان خود jq. اینها
دو بیلدین و اکشن های خواندن خود jq را می توان با یکدیگر در هم آمیخت.

یک توکار حداقل قابلیت خروجی را فراهم می کند، اشکال زدایی کردن. (به یاد بیاورید که یک برنامه jq
مقادیر خروجی همیشه به صورت متن های JSON در خروجی قرار می گیرند stdout.) اشکال زدایی کردن ساخته شده می تواند داشته باشد
رفتار ویژه برنامه، مانند برنامه های اجرایی که از libjq C API استفاده می کنند اما از آن استفاده نمی کنند.
خود فایل اجرایی jq

ورودی
خروجی یک ورودی جدید.

ورودی
تمام ورودی های باقی مانده را یک به یک خروجی می دهد.

این در درجه اول برای کاهش ورودی های برنامه مفید است.

اشکال زدایی کردن
باعث ایجاد یک پیام اشکال زدایی بر اساس مقدار ورودی می شود. jq اجرایی می پیچد
مقدار ورودی با ["اشکال زدایی:"، ] و آن و یک خط جدید را در stderr چاپ می کند،
فشرده این مورد ممکن است در آینده تغییر کند.

input_filename
نام فایلی که ورودی آن در حال حاضر فیلتر شده است را برمی گرداند. توجه داشته باشید که این خواهد شد
خوب کار نمی کند مگر اینکه jq در محلی UTF-8 اجرا شود.

ورودی_خط_شماره
شماره خط ورودی در حال فیلتر شدن را برمی‌گرداند.

جریان


با -- جریان گزینه jq می تواند متون ورودی را به صورت جریانی تجزیه کند و به jq اجازه دهد
برنامه هایی برای شروع پردازش متون بزرگ JSON بلافاصله به جای بعد از تجزیه
کامل می کند. اگر یک متن JSON با حجم 1 گیگابایت دارید، پخش جریانی به شما امکان می دهد
تا خیلی سریعتر آن را پردازش کند.

با این حال، مقابله با استریم، همانطور که برنامه jq انجام خواهد داد، آسان نیست [ ،
] (و چند فرم دیگر) به عنوان ورودی.

چندین توکار برای آسان تر کردن جریان ها ارائه شده است.

مثال‌های زیر از شکل جریانی استفاده می‌کنند [0، [1]]است که
[[0],0],[[1,0],1],[[1,0]],[[1]].

فرم های استریم شامل [ ، ] (برای نشان دادن هر مقدار اسکالر، آرایه خالی،
یا شی خالی)، و [ ] (برای نشان دادن انتهای یک آرایه یا شی). آینده
نسخه های jq اجرا می شوند -- جریان و دنباله ممکن است فرم های اضافی مانند ["خطا
پیام"] هنگامی که یک متن ورودی تجزیه نمی شود.

truncate_stream (stream_expression)
یک عدد را به عنوان ورودی مصرف می کند و تعداد متناظر عناصر مسیر را از آن کوتاه می کند
سمت چپ خروجی عبارت جریان داده شده.

jq ´[1|truncate_stream([[0],1],[[1,0],2],[[1,0]],[[1]])]´
1
=> [[[0]،2]،[[0]]]

fromstream(stream_expression)
مقادیر متناظر با خروجی های عبارت جریان را خروجی می دهد.

jq ´fromstream(1|truncate_stream([[0],1],[[1,0],2],[[1,0]],[[1]]))´
تهی
=> [2،XNUMX،XNUMX،XNUMX]

در جریان
La در جریان داخلی شکل جریانی ورودی خود را خروجی می دهد.

jq ´. به عنوان $dot|fromstream($dot|tostream)|.==$dot´
[0،[1،{"a":1}،{"b":2}]]
=> درست است

وظیفه


Assignment در jq کمی متفاوت از اکثر زبان های برنامه نویسی عمل می کند. jq اینطور نیست
تمایز بین ارجاعات به چیزی و کپی های آن - دو شی یا آرایه هستند
یا مساوی یا غیر مساوی، بدون هیچ مفهوم دیگری از «همان شی» یا «نه» بودن
همان شی".

اگر یک شی دارای دو فیلد آرایه باشد، .فو و .بار، و چیزی را به آن اضافه می کنید
.فو، و سپس .بار بزرگتر نخواهد شد حتی اگر به تازگی تنظیم کرده باشید .بار = .فو. اگر استفاده می کنید
به برنامه نویسی در زبان هایی مانند پایتون، جاوا، روبی، جاوا اسکریپت و غیره می توانید فکر کنید
گویی jq یک کپی عمیق کامل از هر شی را قبل از انجام انتساب انجام می دهد
(برای عملکرد، در واقع این کار را نمی کند، اما این ایده کلی است).

تمام عملگرهای انتساب در jq دارای عبارات مسیر در سمت چپ هستند.

=
فیلتر .فو = 1 یک شی را به عنوان ورودی می گیرد و یک شی را به عنوان خروجی تولید می کند
فیلد "foo" روی 1 تنظیم شده است. هیچ مفهومی از "تغییر" یا "تغییر" چیزی در jq وجود ندارد -
همه مقادیر jq تغییرناپذیر هستند. برای مثال،

.foo = .bar | .foo.baz = 1

اثر جانبی تنظیم .bar.baz برای تنظیم روی 1 را به عنوان ظاهر مشابه نخواهد داشت.
برنامه ای در جاوا اسکریپت، پایتون، روبی یا زبان های دیگر. برخلاف این زبان ها (اما
مانند Haskell و برخی از زبان های کاربردی دیگر)، هیچ مفهومی از دو آرایه یا وجود ندارد
اشیاء "همان آرایه" یا "همان شی". آنها می توانند برابر باشند، یا مساوی نباشند، اما
اگر یکی از آنها را در هیچ شرایطی تغییر دهیم، دیگری پشت سر ما تغییر نخواهد کرد.

این بدان معناست که ساخت مقادیر دایره‌ای در jq غیرممکن است (مانند آرایه‌ای که
عنصر اول خودش است). این کاملا عمدی است و تضمین می کند که هر چیزی jq باشد
برنامه را می توان تولید کرد را می توان در JSON نشان داد.

توجه داشته باشید که سمت چپ ´=´ به یک مقدار در اشاره دارد .. بدین ترتیب $var.foo = 1 کار نخواهد کرد
همانطور که انتظار میرفت ($var.foo یک عبارت مسیر معتبر یا مفید در نیست .) استفاده کنید $var | .فو = 1
به جای آن.

اگر سمت راست ´=´ چندین مقدار تولید کند، برای هر یک از این مقدار jq خواهد بود
مسیرهای سمت چپ را روی مقدار تنظیم کنید و سپس مقدار تغییر یافته را خروجی خواهد داد ..
به عنوان مثال، (.a,.b)=محدوده(2) خروجی {"a":0,"b":0}، و سپس {"a":1,"b":1}. به روز رسانی"
فرم های تکلیف (به زیر مراجعه کنید) این کار را انجام نمی دهند.

توجه داشته باشید که آن را .a,.b=0 تنظیم نمی کند .a و .b، اما (.a,.b)=0 هر دو را تنظیم می کند.

|=
علاوه بر عملگر انتساب ´=´، jq عملگر «به روز رسانی» ´|=´ را ارائه می کند که
یک فیلتر در سمت راست می گیرد و مقدار جدید را برای ویژگی of تعیین می کند .
با اجرای مقدار قدیمی از طریق این عبارت به آن اختصاص داده می شود. به عنوان مثال، .foo |=
.+1 یک شی می سازد که فیلد "foo" روی "foo" به اضافه 1 ورودی تنظیم شده است.

این مثال باید تفاوت بین '=' و '|=' را نشان دهد:

ورودی ´{"a": {"b": 10}، "b": 20}" را به برنامه ها ارائه دهید:

.a = .b .a |= .b

اولی فیلد "a" ورودی را روی فیلد "b" ورودی تنظیم می کند و تولید می کند
خروجی {"a": 20}. دومی فیلد "a" ورودی را روی فیلد "a" تنظیم می کند
فیلد "b"، تولید {"a": 10}.

سمت چپ می تواند هر عبارت مسیر کلی باشد. دیدن مسیر().

توجه داشته باشید که سمت چپ ´|=´ به یک مقدار در اشاره دارد .. بدین ترتیب $var.foo |= . + 1 نمی خواهد
همانطور که انتظار می رود کار کنید ($var.foo یک عبارت مسیر معتبر یا مفید در نیست .) استفاده کنید $var | .فو
|= . + 1 به جای آن.

اگر سمت راست چندین مقدار را خروجی دهد، فقط آخرین مورد استفاده خواهد شد.

jq ´(..|انتخاب(نوع=="بولی")) |= اگر . سپس 1 دیگری 0 پایان´
[درست، نادرست، [5، درست، [درست، [نادرست]]، نادرست]]
=> [1,0,[5,1,[1,[0]],0]]

+=، -=، *=، /=، %=، // =
jq چند عملگر از فرم دارد a op= b، که همگی معادل هستند a |= . op b. بنابراین،
+= 1 می توان از آن برای افزایش مقادیر استفاده کرد.

jq ´.foo += 1´
{"foo": 42}
=> {"foo": 43}

جراحی های تکالیف
موارد بسیار بیشتری در سمت چپ یک تکلیف jq نسبت به اکثر موارد مجاز است
زبان ها. ما قبلاً دسترسی‌های میدانی ساده را در سمت چپ دیده‌ایم، و خیر
تعجب می کنم که دسترسی های آرایه ای به همین خوبی کار می کنند:

.posts[0].title = "راهنمای JQ"

چیزی که ممکن است تعجب برانگیز باشد این است که عبارت سمت چپ ممکن است چندین بار تولید کند
نتایج با اشاره به نکات مختلف در سند ورودی:

.posts[].comments |= . + ["این عالی است"]

آن مثال، رشته «این عالی است» را به آرایه «نظرات» هر پست اضافه می‌کند
ورودی (که در آن ورودی یک شی با فیلد "پست ها" است که آرایه ای از پست ها است).

هنگامی که jq با تخصیصی مانند ´a = b´ مواجه می شود، «مسیر» طی شده برای انتخاب یک را ثبت می کند.
بخشی از سند ورودی در حین اجرای a. سپس از این مسیر برای یافتن کدام قسمت استفاده می شود
ورودی برای تغییر در هنگام اجرای تکلیف. هر فیلتری ممکن است بر روی آن استفاده شود
سمت چپ یک برابر است - هر مسیری را که از ورودی انتخاب کند همان جایی است که
تکلیف انجام می شود.

این یک عملیات بسیار قدرتمند است. فرض کنید می‌خواهیم نظری به پست‌های وبلاگ اضافه کنیم، با استفاده از
همان ورودی "وبلاگ" بالا. این بار فقط می خواهیم در مورد پست های نوشته شده توسط
"استدولان". ما می توانیم آن پست ها را با استفاده از تابع "انتخاب" که قبلا توضیح داده شد پیدا کنیم:

پست‌ها[] | select(.author == "stedolan")

مسیرهای ارائه شده توسط این عملیات به هر یک از پست هایی که "stedolan" نوشته است اشاره می کند و
ما می توانیم در مورد هر یک از آنها به همان روشی که قبلاً انجام دادیم اظهار نظر کنیم:

(.posts[] | select(.author == "stedolan") | .comments) |=
. + ["وحشتناک"]

مدولا


jq دارای یک سیستم کتابخانه/ماژول است. ماژول ها فایل هایی هستند که نام آنها به پایان می رسد jq.

ماژول های وارد شده توسط یک برنامه در یک مسیر جستجوی پیش فرض جستجو می شوند (به زیر مراجعه کنید). در
واردات و شامل دستورالعمل ها به واردکننده اجازه می دهد این مسیر را تغییر دهد.

مسیرهای موجود در مسیر جستجو در معرض جایگزین‌های مختلفی هستند.

برای مسیرهایی که با "~/" شروع می شوند، فهرست اصلی کاربر جایگزین "~" می شود.

برای مسیرهایی که با «$ORIGIN/» شروع می‌شوند، مسیر فایل اجرایی jq جایگزین می‌شود.
"$ORIGIN".

برای مسیرهایی که با "./" شروع می شوند یا مسیرهایی که "." هستند، مسیر فایل شامل است
جایگزین «.» شد. برای برنامه های سطح بالای داده شده در خط فرمان، جریان
دایرکتوری استفاده می شود.

دستورالعمل‌های واردات می‌توانند به صورت اختیاری یک مسیر جستجو را که پیش‌فرض به آن اضافه می‌شود، مشخص کنند.

مسیر جستجوی پیش‌فرض مسیر جستجویی است که به آن داده می‌شود -L گزینه خط فرمان، دیگری
["~/.jq", "$ORIGIN/../lib/jq"، "$ORIGIN/../ lib"].

عناصر مسیر رشته تهی و خالی پردازش مسیر جستجو را خاتمه می دهند.

یک وابستگی با مسیر نسبی "foo/bar" در "foo/bar.jq" جستجو می شود و
"foo/bar/bar.jq" در مسیر جستجوی داده شده. این برای اجازه دادن به ماژول ها برای قرار دادن در نظر گرفته شده است
در یک دایرکتوری همراه با، به عنوان مثال، فایل های کنترل نسخه، فایل های README، و غیره،
بلکه اجازه دادن به ماژول های تک فایلی را نیز می دهد.

اجزای متوالی با نام یکسان برای جلوگیری از ابهام مجاز نیستند (به عنوان مثال،
"فو/فو").

مثلاً با -L$HOME/.jq یک ماژول فو را می توان در یافت $HOME/.jq/foo.jq و
$HOME/.jq/foo/foo.jq.

اگر "$HOME/.jq" یک فایل باشد، منبع آن در برنامه اصلی است.

واردات RelativePathString as نام [ ]؛
ماژول یافت شده در مسیر داده شده را نسبت به دایرکتوری در مسیر جستجو وارد می کند. یک ".jq"
پسوند به رشته مسیر نسبی اضافه خواهد شد. نمادهای ماژول با پیشوند هستند
"نام::".

ابرداده اختیاری باید یک عبارت jq ثابت باشد. باید یک شی با کلید باشد
مانند "صفحه اصلی" و غیره. در این زمان jq فقط از کلید/مقدار "جستجو" استفاده می کند
ابرداده فراداده نیز از طریق در دسترس کاربران قرار می گیرد modulemeta ساخته شده

کلید "جستجو" در ابرداده، در صورت وجود، باید دارای مقدار رشته یا آرایه (آرایه
رشته ها)؛ این مسیر جستجو است که باید پیشوند مسیر جستجوی سطح بالا باشد.

شامل RelativePathString [ ]؛
یک ماژول یافت شده در مسیر داده شده را نسبت به دایرکتوری در مسیر جستجو وارد می کند، به گونه ای که انگار آن را دارد
در جای خود گنجانده شدند. یک پسوند ".jq" به رشته مسیر نسبی اضافه خواهد شد. را
نمادهای ماژول به فضای نام تماس گیرنده وارد می شوند که گویی محتوای ماژول وارد شده است
به طور مستقیم گنجانده شده است.

ابرداده اختیاری باید یک عبارت jq ثابت باشد. باید یک شی با کلید باشد
مانند "صفحه اصلی" و غیره. در این زمان jq فقط از کلید/مقدار "جستجو" استفاده می کند
ابرداده فراداده نیز از طریق در دسترس کاربران قرار می گیرد modulemeta ساخته شده

واردات RelativePathString as $NAME [ ]؛
یک فایل JSON که در مسیر داده شده نسبت به دایرکتوری در مسیر جستجو پیدا شده است را وارد می کند. آ
پسوند ".json" به رشته مسیر نسبی اضافه خواهد شد. داده های فایل خواهد بود
موجود به عنوان $NAME::NAME.

ابرداده اختیاری باید یک عبارت jq ثابت باشد. باید یک شی با کلید باشد
مانند "صفحه اصلی" و غیره. در این زمان jq فقط از کلید/مقدار "جستجو" استفاده می کند
ابرداده فراداده نیز از طریق در دسترس کاربران قرار می گیرد modulemeta ساخته شده

کلید "جستجو" در ابرداده، در صورت وجود، باید دارای مقدار رشته یا آرایه (آرایه
رشته ها)؛ این مسیر جستجو است که باید پیشوند مسیر جستجوی سطح بالا باشد.

واحد ;
این دستورالعمل کاملا اختیاری است. برای عملکرد صحیح مورد نیاز نیست خدمت می کند
تنها هدف از ارائه ابرداده است که می توان با آن خواند modulemeta ساخته شده

ابرداده باید یک عبارت jq ثابت باشد. باید یک شی با کلیدهایی مانند
"صفحه نخست". در حال حاضر jq از این ابرداده استفاده نمی کند، اما در دسترس کاربران قرار می گیرد
از طریق modulemeta ساخته شده

modulemeta
یک نام ماژول را به عنوان ورودی می گیرد و ابرداده ماژول را به عنوان یک شی با استفاده از
وارد کردن ماژول (از جمله ابرداده) به عنوان یک مقدار آرایه برای کلید "deps".

برنامه ها می توانند از این برای پرس و جو کردن ابرداده های یک ماژول استفاده کنند، که سپس می توانند برای آن استفاده کنند
به عنوان مثال، وابستگی های گمشده را جستجو، دانلود و نصب کنید.

با استفاده از خدمات onworks.net از jq آنلاین استفاده کنید


سرورها و ایستگاه های کاری رایگان

دانلود برنامه های ویندوز و لینوکس

  • 1
    Zabbix
    Zabbix
    Zabbix یک شرکت باز در کلاس سازمانی است
    منبع راه حل نظارتی توزیع شده
    طراحی شده برای نظارت و ردیابی
    عملکرد و در دسترس بودن شبکه
    سرور، دستگاه ...
    دانلود Zabbix
  • 2
    KDIFF3
    KDIFF3
    این مخزن دیگر نگهداری نمی شود
    و برای اهداف آرشیوی نگهداری می شود. دیدن
    https://invent.kde.org/sdk/kdiff3 for
    جدیدترین کد و
    https://download.kde.o...
    دانلود KDiff3
  • 3
    USBLoaderGX
    USBLoaderGX
    USBLoaderGX رابط کاربری گرافیکی است
    لودر USB Waninkoko بر اساس
    libwiigui. این اجازه می دهد تا لیست و
    راه اندازی بازی های Wii، بازی های Gamecube و
    homebrew در Wii و WiiU...
    USBLoaderGX را دانلود کنید
  • 4
    فایر فاکس
    فایر فاکس
    Firebird RDBMS ویژگی های ANSI SQL را ارائه می دهد
    و روی لینوکس، ویندوز و اجرا می شود
    چندین پلتفرم یونیکس امکانات
    همزمانی و عملکرد عالی
    & قدرت...
    Firebird را دانلود کنید
  • 5
    KompoZer
    KompoZer
    KompoZer یک ویرایشگر HTML wysiwyg است که از آن استفاده می کند
    پایگاه کد موزیلا کامپوزر مانند
    توسعه Nvu متوقف شده است
    در سال 2005، KompoZer بسیاری از باگ ها را برطرف کرد و
    اف می افزاید...
    دانلود KompoZer
  • 6
    دانلود مانگا رایگان
    دانلود مانگا رایگان
    دانلودر رایگان مانگا (FMD) یک برنامه است
    برنامه متن باز نوشته شده در
    Object-Pascal برای مدیریت و
    دانلود مانگا از وب سایت های مختلف
    این یک آینه است...
    دانلود رایگان مانگا دانلود
  • بیشتر "

دستورات لینوکس

Ad