Згадаймо, що jq підтримує ті самі типи даних, що й JSON.
JSON описує рядки тексту (англ. string) так:
Рядком тексту називають послідовність, що містить нуль або більше символів Unicode, узяту в подвійні лапки, де для екранування використовується зворотний слеш.
Щоб убудувати «спеціальні» символи, усередині рядка тексту використовуємо зворотний слеш:
\" буквальна лапка,\\ буквальний зворотний слеш,\n, \t, \r, \f, \b
\uAAAA, де A позначає шістнадцяткову цифруЩоб дізнатися кількість символів, використовуємо функцію length.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
Нотацію зрізу можна використати, щоб видобути підрядки.
Синтаксис такий: .[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!"]
Функція join/1 виконує дію, обернену до split/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]
Функція implode виконує дію, обернену до explode.
Використовуємо функцію index/1; індекс відраховується від нуля.
"hello" | index("el")' # => 1
Якщо підрядка немає в рядку тексту, результатом буде null
"hello" | index("elk") # => null
Усередині рядка тексту послідовність \(expression) вбудує результат цього виразу у рядок тексту:
"The current datetime is \(now | strflocaltime("%c"))" # => "The current datetime is Wed Nov 16 17:06:33 2022"
Використовуємо функції ascii_downcase та ascii_upcase.
jq має багату підтримку регулярних виразів: це стане темою одного з наступних уроків.
У цій вправі ми будемо обробляти записи журналу.
Кожен рядок журналу - це рядок тексту (англ. string) такого формату: "[<LEVEL>]: <MESSAGE>".
Є три різні рівні журналу:
INFOWARNINGERRORУ нас є три завдання; у кожному треба взяти рядок журналу і щось із ним зробити. Є багато способів розвʼязати ці завдання: виберімо улюблені прийоми з наведених вище прикладів і подивімося, що в нас вийде.
Реалізуйте функцію message, щоб вона повертала повідомлення з рядка журналу:
"[ERROR]: Invalid operation" | message
# => "Invalid operation"
Усі пробільні символи на початку та в кінці потрібно прибрати:
"[WARNING]: Disk almost full\r\n" | message
# => "Disk almost full"
Реалізуйте функцію log_level, яка повертає рівень журналу з рядка журналу; його потрібно повертати малими літерами:
"[ERROR]: Invalid operation" | log_level
# => "error"
Реалізуйте функцію reformat, яка переформатовує рядок журналу, ставлячи повідомлення першим, а рівень журналу після нього в дужках:
"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Зареєструйтеся на Exercism, щоб вивчати й опановувати jq, а також 12 концепцій75 вправ та справжнє наставництво від людей, і все це безкоштовно.