昨天我們認識了 jqplay 這個輕便實用的線上工具,我們接著學習更多 jq filter 的用法吧。
師傅:今天學習字串變數置換(String interpolation)。準備好了嗎?
徒弟:是的,師傅!我已經迫不及待要學習新的技能了。
師傅:很好。先回顧一下,如何提取JSON物件的title屬性?
徒弟:呃...我想是這樣:jq ".title" todo.json
?
師傅:沒錯。現在,我們來看看如何將它與其他文字組合。試試這個:jq "\"Task: \(.title)\"" todo.json
徒弟:哇!這是將"Task:"和title的值組合在一起了嗎?
師傅:正確。這就是字串變數置換。\()
內可以放任何jq表達式。
徒弟:太酷了!那麼,我們可以擺放多個變數值嗎?
師傅:當然。試試這個:jq "\"Task \(.id): \(.title)\"" todo.json
徒弟:我明白了!這樣我們就可以組出更複雜的輸出格式了。
師傅:沒錯。現在,你能建立一個包含所有屬性的字串嗎?
徒弟:讓我試試...jq "\"ID: \(.id), Title: \(.title), Completed: \(.completed), User ID: \(.userId)\"" todo.json
師傅:完美。你學得很快。
String interpolation 直接翻譯可以是 "字串插值" ,然而因為這個用法的意義是「在一段字串樣板之中,指定位置擺放變數,運算結果會將該變數以變數值取代輸出成文字」,其中有「可以指定位置再以值取代」的重要意思,簡單來說就是「置換」,所以我覺得翻作 「字串變數置換」比較切中題意(推眼鏡👓)。
字串變數置換的語法是 \(變數)
,例如前面對話中的 \(.title)
。如果在字串中沒有使用字串變數置換的語法,只能顯示出 .title 的結果。下面兩張圖做比較:
字串中直接放 .title |
使用字串變數置換 \(.title) |
---|---|
前面對話中的表達式是要輸出一段字串,因此先用引號括住 "Task: ..."
, 這時候就看出使用命令提示字元的缺點,因為命令提示字元原本 jq filter 就是雙引號,裡面再出現雙引號,就需要跳脫字元。如下,比起原先使用單引號的 shell 環境,因為多了跳脫字元而變成較不易閱讀的樣子。
單引號 shell | 雙引號 cmd |
---|---|
jq '"Task: \(.title)"' |
jq " \"Task: \(.title)\" " |
這樣看起來,處理字串的時候,使用 jqplay 線上工具,能先簡化一層雙引號,有大大的幫助😅。
jq '"ID: \(.id), Title: \(.title)"'
jq '"ID: \(.id), Title: \(.title), Completed: \(.completed), User ID: \(.userId)"'
今天我們認識了 字串變數置換 (String interpolation)的用法,想要組字串的時候,用這個方法是最直覺的。也在這個用法之中,才真正體會到 shell 可能比 命令提示字元適合使用 jq 😅,只要適當使用跳脫字元還是可以繼續使用命令提示字元的。感謝認真的自己,今天認真的學習,明天繼續囉~