به یاد بیاورید که 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 از عبارتهای باقاعده پشتیبانی خوبی میکند: این موضوع، مبحث یک درس بعدی است.