Θυμήσου ότι το jq υποστηρίζει τους ίδιους τύπους δεδομένων με τη JSON.
Η JSON περιγράφει τις συμβολοσειρές ως εξής:
Μια συμβολοσειρά είναι μια ακολουθία από μηδέν ή περισσότερους χαρακτήρες Unicode, κλεισμένη σε διπλά εισαγωγικά, χρησιμοποιώντας διαφυγές με backslash.
Μέσα σε μια συμβολοσειρά, χρησιμοποίησε τον χαρακτήρα backslash για να ενσωματώσεις "ειδικούς" χαρακτήρες:
\" ένα κυριολεκτικό εισαγωγικό,\\ ένα κυριολεκτικό backslash,\n, \t, \r, \f, \b
\uAAAA, όπου το A είναι δεκαεξαδικό ψηφίοΓια να βρεις τον αριθμό των χαρακτήρων, χρησιμοποίησε τη συνάρτηση length.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
Για να βρεις τον αριθμό των πραγματικών bytes, χρησιμοποίησε τη συνάρτηση utf8bytelength.
$ jq -cn --args '$ARGS.positional[] | utf8bytelength' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
27
Ο συμβολισμός slice μπορεί να χρησιμοποιηθεί για την εξαγωγή υποσυμβολοσειρών.
Η σύνταξη είναι .[i:j].
Η υποσυμβολοσειρά που επιστρέφεται έχει μήκος j - i και περιέχει χαρακτήρες από τη θέση i (συμπεριλαμβανομένης) έως τη θέση j (μη συμπεριλαμβανομένης).
Οποιαδήποτε από τις δύο θέσεις μπορεί να είναι αρνητική, οπότε μετράει προς τα πίσω από το τέλος της συμβολοσειράς.
Οποιαδήποτε από τις δύο θέσεις μπορεί να παραλειφθεί, οπότε αναφέρεται στην αρχή ή στο τέλος της συμβολοσειράς.
Οι θέσεις ξεκινούν από το μηδέν.
"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]
Χρησιμοποίησε τη συνάρτηση index/1· η θέση ξεκινά από το μηδέν.
"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 δεν περιλαμβάνουν δεκαεξαδικές ή οκταδικές μορφές που υποστηρίζουν κάποιες γλώσσες.
Δες το εγχειρίδιο για περισσότερες λεπτομέρειες σχετικά με αυτές τις συναρτήσεις:
*
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 έχει πλούσια υποστήριξη για κανονικές εκφράσεις: αυτό θα είναι το θέμα μιας επόμενης ενότητας.