تذكّر أن jq يدعم أنواع البيانات نفسها التي يدعمها JSON.
يصف JSON السلاسل النصية كما يلي:
السلسلة النصية هي تسلسل من صفر أو أكثر من محارف يونيكود، تُحاط بعلامتي اقتباس مزدوجتين، وتُستخدم فيها تسلسلات الهروب بمحرف الشرطة المائلة العكسية.
داخل السلسلة النصية، استخدم محرف الشرطة المائلة العكسية لإدراج محارف «خاصة»:
\" علامة اقتباس حرفية،\\ شرطة مائلة عكسية حرفية،\n، \t، \r، \f، \b
\uAAAA حيث يمثل A رقماً سادس عشرياًلمعرفة عدد المحارف، استخدم الدالة length.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
يمكن استخدام صيغة التقطيع لاستخراج سلاسل نصية فرعية.
الصيغة هي .[i:j].
طول السلسلة النصية الفرعية المُرجَعة هو j - i، وهي تُرجع محارف من الفهرس i (ضمناً) إلى الفهرس j (دون تضمينه).
يمكن أن يكون أي من الفهرسَين سالباً، وفي هذه الحالة يُعدّ عكسياً من نهاية السلسلة النصية.
يمكن حذف أي من الفهرسَين، وفي هذه الحالة يشير إلى بداية السلسلة النصية أو نهايتها.
تبدأ الفهارس من الصفر.
"abcdefghij"[3:6] # => "def"
"abcdefghij"[3:] # => "defghij"
"abcdefghij"[:-2] # => "abcdefgh"
استخدم + لربط السلاسل النصية:
"Hello" + " " + "world!"
# => "Hello world!"
استخدم add عند التعامل مع مصفوفة من السلاسل النصية:
["Hello", " ", "world!"] | add
# => "Hello world!"
يتم التقسيم باستخدام الدالة split/1 أو العامل /:
"Hello beautiful world!" | split(" ") # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " " # => ["Hello", "beautiful", "world!"]
عكس split/1 هو join/1.
غالباً ما نحتاج إلى تحويل سلسلة نصية إلى مصفوفة من المحارف. هناك أسلوبان لفعل ذلك:
التقسيم عند سلسلة نصية فارغة
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
explode إلى مصفوفة من نقاط الترميز
"Hi friend 😀" | explode # => [72,105,32,102,114,105,101,110,100,32,128512]
implode هي عكس explode.
استخدم الدالة index/1؛ يبدأ الفهرس من الصفر.
"hello" | index("el")' # => 1
إذا لم تكن السلسلة النصية الفرعية موجودة في السلسلة النصية، فإن النتيجة هي null
"hello" | index("elk") # => null
داخل السلسلة النصية، يُدرج التسلسل \(expression) نتيجة ذلك التعبير في السلسلة النصية:
"The current datetime is \(now | strflocaltime("%c"))" # => "The current datetime is Wed Nov 16 17:06:33 2022"
استخدم الدالتين ascii_downcase وascii_upcase.
يدعم jq التعبيرات النمطية دعماً واسعاً: وسيكون هذا موضوع درس لاحق.
في هذا التمرين ستتعامل مع مدخلات السجل.
كل سطر سجل هو سلسلة نصية بتنسيق كالتالي: "[<LEVEL>]: <MESSAGE>".
هناك ثلاثة مستويات مختلفة للسجل:
INFOWARNINGERRORلديك ثلاث مهام، تأخذ كل واحدة منها سطر سجل وتطلب منك فعل شيء به. هناك طرق كثيرة لحل هذه المهام، اختر تقنياتك المفضلة من الأمثلة السابقة وانظر ما يمكنك التوصل إليه.
نفّذ الدالة message لتُرجع رسالة سطر السجل:
"[ERROR]: Invalid operation" | message
# => "Invalid operation"
يجب إزالة أي مسافات بيضاء في البداية أو النهاية:
"[WARNING]: Disk almost full\r\n" | message
# => "Disk almost full"
نفّذ الدالة log_level لتُرجع مستوى السجل لسطر السجل، ويجب إرجاعه بحروف صغيرة:
"[ERROR]: Invalid operation" | log_level
# => "error"
نفّذ الدالة reformat التي تعيد تنسيق سطر السجل، فتضع الرسالة أولًا ويليها مستوى السجل بين الأقواس الهلالية:
"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
سجّل في Exercism لتتعلّم وتتقن jq عبر 12 مفهومًا75 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.