jqはJSONと同じデータ型をサポートしていることを思い出してください。
JSONでは、文字列を次のように説明しています。
文字列とは、0個以上のUnicode文字の並びであり、二重引用符で囲まれ、バックスラッシュによるエスケープを使います。
文字列の中では、バックスラッシュを使うと「特殊な」文字を埋め込むことができます。
\":引用符そのもの\\:バックスラッシュそのもの\n、\t、\r、\f、\b
\uAAAA(Aは16進数の数字)文字数を調べるには、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(iを含む)からインデックスj(jを含まない)までの文字を返します。
どちらのインデックスも負の値にでき、その場合は文字列の末尾から後ろ向きに数えます。
どちらのインデックスも省略でき、その場合は文字列の先頭か末尾を指します。
インデックスは0から始まります。
"abcdefghij"[3:6] # => "def"
"abcdefghij"[3:] # => "defghij"
"abcdefghij"[:-2] # => "abcdefgh"
文字列を連結するには、+を使います。
"Hello" + " " + "world!"
# => "Hello world!"
文字列の配列を渡す場合は、addを使います。
["Hello", " ", "world!"] | add
# => "Hello world!"
"Hello beautiful world!" | split(" ") # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " " # => ["Hello", "beautiful", "world!"]
文字列を文字の配列に変換することはよくあります。 これには2つの方法があります。
空文字列で分割する
"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関数を使います。インデックスは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関数を使います。
文字列から数値を作るには、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の数値には、一部の言語がサポートしている16進数や8進数の表記は含まれないことに注意してください。
これらの関数の詳細については、マニュアルを確認してください。
*
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は正規表現を豊富にサポートしています。これは後のレッスンで扱うトピックです。