Emlékezz vissza, hogy a jq ugyanazokat az adattípusokat támogatja, mint a JSON.
A JSON a stringeket így írja le:
A string nulla vagy több Unicode-karakterból álló sorozat, kettős idézőjelek közé zárva, escape-szekvenciák segítségével.
A stringen belül a visszaperjel karakterrel ágyazhatsz be „különleges” karaktereket:
\" egy szó szerinti idézőjel,\\ egy szó szerinti visszaperjel,\n, \t, \r, \f, \b
\uAAAA, ahol az A egy hexadecimális számjegyA karakterek számának meghatározásához használd a length függvényt.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
A tényleges bájtok számának meghatározásához a utf8bytelength függvényt használd.
$ jq -cn --args '$ARGS.positional[] | utf8bytelength' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
27
A részstringek kinyeréséhez a slice jelölést használhatod.
A szintaxis: .[i:j].
A visszaadott részstring hossza j - i, és az i indexű karaktertől (beleértve) a j indexű karakterig (kizárólag) adja vissza a karaktereket.
Bármelyik index lehet negatív, ilyenkor a string végétől visszafelé számol.
Bármelyik index elhagyható, ilyenkor a string elejére vagy végére utal.
Az indexelés nullától indul.
"abcdefghij"[3:6] # => "def"
"abcdefghij"[3:] # => "defghij"
"abcdefghij"[:-2] # => "abcdefgh"
A stringek összefűzéséhez használd a + operátort:
"Hello" + " " + "world!"
# => "Hello world!"
Ha stringekből álló tömböt kapsz, használd az add függvényt:
["Hello", " ", "world!"] | add
# => "Hello world!"
A felosztáshoz a split/1 függvényt vagy a / operátort használhatod:
"Hello beautiful world!" | split(" ") # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " " # => ["Hello", "beautiful", "world!"]
Gyakran szükség van arra, hogy egy stringet karakterek tömbjévé alakítsunk. Erre két módszer van:
felosztás üres stringre
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
explode egy kódpontokat tartalmazó tömbre
"Hi friend 😀" | explode # => [72,105,32,102,114,105,101,110,100,32,128512]
Használd az index/1 függvényt; az indexelés nullától indul.
"hello" | index("el")' # => 1
Ha a részstring nincs benne a stringben, az eredmény null.
"hello" | index("elk") # => null
További hasznos függvények: rindex/1 és indices.
A stringen belül a \(expression) sorozat beágyazza a kifejezés eredményét a stringbe:
"The current datetime is \(now | strflocaltime("%c"))" # => "The current datetime is Wed Nov 16 17:06:33 2022"
A string kis- és nagybetűinek megváltoztatásához használd az ascii_downcase és az ascii_upcase függvényt.
A tonumber függvénnyel stringből hozhatsz létre számot.
Ez hibát dob, ha a string nem alakítható számmá, ezért szükség lehet a try-catch szerkezetre.
$ 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"
Vedd figyelembe, hogy a JSON-számok nem tartalmaznak hexadecimális vagy oktális változatokat, amelyeket néhány nyelv támogat.
A függvények részleteiről a kézikönyvben olvashatsz:
*
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
A jq széles körben támogatja a reguláris kifejezéseket: erről egy későbbi leckében lesz szó.