رش

رشته در 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 تمرین دیگر را باز کنید