回想一下,jq支援與 JSON 相同的資料型態。
JSON 將字串描述為:
字串是由零個或多個 Unicode 字元組成的序列,並以雙引號包住,使用反斜線跳脫。
在字串中,使用反斜線字元來嵌入「特殊」字元:
\"字面上的引號,\\字面上的反斜線,\n、\t、\r、\f、\b
\uAAAA,其中A是十六進位數字若要找出字元數量,請使用length函式。
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
slice標記法可用來擷取子字串。
語法是.[i:j]。
回傳的子字串長度為j - i,包含從索引i(含)到索引j(不含)之間的字元。
任一個索引都可以是負數,此時會從字串結尾往回計算。
任一個索引都可以省略,此時代表字串的開頭或結尾。
索引從 0 開始。
"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]
implode是explode的反向操作。
使用index/1函式;索引從 0 開始。
"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對正規表示式有豐富的支援:這會是之後某個單元的主題。
在這個練習中,你會處理日誌項目。
每一行日誌都是一個格式如下的字串:"[<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)"