Нагадаємо, що jq підтримує ті самі типи даних, що й JSON.
JSON описує рядки тексту (англ. string) так:
Рядок тексту - це послідовність із нуля або більше символів Unicode, узята в подвійні лапки, із застосуванням екранованих послідовностей зі зворотною косою рискою.
Усередині рядка тексту можна використати символ зворотної косої риски, щоб вставити «спеціальні» символи:
\" буквальні лапки,\\ буквальна зворотна коса риска,\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.
Часто потрібно перетворити рядок тексту на масив символів. Є два способи це зробити:
розділення за порожнім рядком тексту
"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 має багату підтримку регулярних виразів: це буде темою одного з наступних уроків.