文字

文字列 の jq

6個の演習

文字列について

jqはJSONと同じデータ型をサポートしていることを思い出してください。 JSONでは、文字列を次のように説明しています。

文字列とは、0個以上のUnicode文字の並びであり、二重引用符で囲まれ、バックスラッシュによるエスケープを使います。

エスケープシーケンス

文字列の中では、バックスラッシュを使うと「特殊な」文字を埋め込むことができます。

  • \":引用符そのもの
  • \\:バックスラッシュそのもの
  • 空白文字:\n、\t、\r、\f、\b
  • Unicode文字:\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!"

分割と結合

分割にはsplit/1関数または/演算子を使います。

"Hello beautiful world!" | split(" ")   # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " "          # => ["Hello", "beautiful", "world!"]

split/1の逆はjoin/1です。

文字列を文字の配列に変換することはよくあります。 これには2つの方法があります。

  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関数を使います。インデックスは0から始まります。

"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の数値には、一部の言語がサポートしている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は正規表現を豊富にサポートしています。これは後のレッスンで扱うトピックです。

GitHubで編集 リンクは新しいウィンドウまたはタブで開きます

文字列を学習する

練習はロックされています

文字列を練習するには、あと8個の演習のロックを解除してください