Διαδρομές
/
jq
jq
/
Ύλη
/
Συμβολοσειρές
Συ

Συμβολοσειρές σε jq

6 ασκήσεις

Σχετικά με την έννοια Συμβολοσειρές

Θυμήσου ότι το jq υποστηρίζει τους ίδιους τύπους δεδομένων με τη JSON. Η JSON περιγράφει τις συμβολοσειρές ως εξής:

Μια συμβολοσειρά είναι μια ακολουθία από μηδέν ή περισσότερους χαρακτήρες Unicode, κλεισμένη σε διπλά εισαγωγικά, χρησιμοποιώντας διαφυγές με backslash.

Ακολουθίες διαφυγής

Μέσα σε μια συμβολοσειρά, χρησιμοποίησε τον χαρακτήρα backslash για να ενσωματώσεις "ειδικούς" χαρακτήρες:

  • \" ένα κυριολεκτικό εισαγωγικό,
  • \\ ένα κυριολεκτικό backslash,
  • χαρακτήρες κενού \n, \t, \r, \f, \b
  • χαρακτήρες unicode \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.

Η μετατροπή μιας συμβολοσειράς σε πίνακα χαρακτήρων είναι συχνά απαραίτητη. Υπάρχουν δύο τρόποι για να το κάνεις αυτό:

  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· η θέση ξεκινά από το μηδέν.

"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 έχει πλούσια υποστήριξη για κανονικές εκφράσεις: αυτό θα είναι το θέμα μιας επόμενης ενότητας.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Συμβολοσειρές

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 8 ακόμη ασκήσεις για να εξασκηθείς στην έννοια Συμβολοσειρές