Треки
/
jq
jq
/
Салабус
/
Рядки тексту
Ря

Рядки тексту у jq

6 вправ

Про концепцію Рядки тексту

Нагадаємо, що jq підтримує ті самі типи даних, що й JSON. JSON описує рядки тексту (англ. string) так:

Рядок тексту - це послідовність із нуля або більше символів Unicode, узята в подвійні лапки, із застосуванням екранованих послідовностей зі зворотною косою рискою.

Екрановані послідовності

Усередині рядка тексту можна використати символ зворотної косої риски, щоб вставити «спеціальні» символи:

  • \" буквальні лапки,
  • \\ буквальна зворотна коса риска,
  • пробільні символи \n, \t, \r, \f, \b
  • символи Unicode \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 вправ, щоб практикувати концепцію Рядки тексту