تذكّر أن jq يدعم أنواع البيانات نفسها التي يدعمها JSON.
يصف JSON السلاسل النصية هكذا:
السلسلة النصية سلسلة من صفر أو أكثر من محارف يونيكود، محاطة بعلامات تنصيص مزدوجة، مع استخدام متتاليات الهروب بالشرطة المائلة العكسية.
داخل السلسلة النصية، استخدم محرف الشرطة المائلة العكسية لتضمين محارف «خاصة»:
\" علامة تنصيص حرفية،\\ شرطة مائلة عكسية حرفية،\n, \t, \r, \f, \b
\uAAAA حيث A رقم سادس عشريلمعرفة عدد المحارف، استخدم دالة length.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
لمعرفة عدد البايتات الفعلي، استخدم دالة utf8bytelength.
$ jq -cn --args '$ARGS.positional[] | utf8bytelength' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
27
يمكن استخدام ترميز التقطيع لاستخراج السلاسل الفرعية.
الصيغة هي .[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!"]
غالباً ما نحتاج إلى تحويل سلسلة نصية إلى مصفوفة من المحارف. هناك أسلوبان للقيام بذلك:
التقسيم على سلسلة نصية فارغة
"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]
استخدم دالة index/1؛ الفهرس يبدأ من الصفر.
"hello" | index("el")' # => 1
إذا لم تكن السلسلة الفرعية موجودة في السلسلة النصية، فالناتج هو null
"hello" | index("elk") # => null
من الدوال المفيدة الأخرى rindex/1 وindices.
داخل السلسلة النصية، تُدرج المتتالية \(expression) ناتج ذلك التعبير في السلسلة النصية:
"The current datetime is \(now | strflocaltime("%c"))" # => "The current datetime is Wed Nov 16 17:06:33 2022"
استخدم دالتي ascii_downcase وascii_upcase لتغيير حالة السلسلة النصية.
استخدم دالة tonumber لإنشاء عدد من سلسلة نصية.
يُطلق هذا خطأً إذا تعذّر تحويل السلسلة النصية إلى عدد، لذلك قد تحتاج إلى try-catch.
$ jq -cn --args '$ARGS.positional[] | [., tonumber]' 42 3.14 oops 1e6 0xbeef
["42",42]
["3.14",3.14]
jq: error (at <unknown>): Invalid numeric literal at EOF at line 1, column 4 (while parsing 'oops')
$ echo $?
5
$ jq -cn --args '$ARGS.positional[] | try [., tonumber] catch "not a number"' 42 3.14 oops 1e6 0xbeef
["42",42]
["3.14",3.14]
"not a number"
["1e6",1000000]
"not a number"
لاحظ أن أعداد JSON لا تشمل صيغ النظام السادس عشري أو الثماني التي تدعمها بعض اللغات.
راجع الدليل لمزيد من التفاصيل عن هذه الدوال:
*
contains/1, inside/1, indices/1, index/1, rindex/1, startswith/1, endswith/1
lsrimstr/1, rtrimstr/1
@text, @json, @html, @uri, @csv, @tsv, @sh, @base64, @base64d
يدعم jq التعبيرات النمطية دعماً غنياً: سيكون هذا موضوع درس لاحق.