المسارات
/
jq
jq
/
المنهج
/
السلاسل النصية
ال

السلاسل النصية في jq

6 تمارين

نبذة عن السلاسل النصية

تذكّر أن 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!"]

عكس split/1 هو join/1.

غالباً ما نحتاج إلى تحويل سلسلة نصية إلى مصفوفة من المحارف. هناك أسلوبان للقيام بذلك:

  1. التقسيم على سلسلة نصية فارغة

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. 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

من الدوال المفيدة الأخرى 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 التعبيرات النمطية دعماً غنياً: سيكون هذا موضوع درس لاحق.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم السلاسل النصية

التدريب مقفل

افتح 8 تمارين إضافية لممارسة السلاسل النصية