Θυμήσου ότι το jq υποστηρίζει τους ίδιους τύπους δεδομένων όπως το JSON.
Το JSON περιγράφει τις συμβολοσειρές ως εξής:
Μια συμβολοσειρά είναι μια ακολουθία από μηδέν ή περισσότερους χαρακτήρες Unicode, μέσα σε διπλά εισαγωγικά, με χρήση διαφυγών με ανάποδη κάθετο.
Μέσα σε μια συμβολοσειρά, χρησιμοποίησε τον χαρακτήρα της ανάποδης κάθετου για να ενσωματώσεις "ειδικούς" χαρακτήρες:
\" ένα κυριολεκτικό εισαγωγικό,\\ μια κυριολεκτική ανάποδη κάθετος,\n, \t, \r, \f, \b
\uAAAA, όπου το A είναι ένα δεκαεξαδικό ψηφίοΓια να βρεις τον αριθμό των χαρακτήρων, χρησιμοποίησε τη συνάρτηση length.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
Ο συμβολισμός 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]
Το implode είναι το αντίστροφο του explode.
Χρησιμοποίησε τη συνάρτηση index/1· η θέση ξεκινά από το μηδέν.
"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.
Το jq έχει πλούσια υποστήριξη για κανονικές εκφράσεις: αυτό θα είναι το θέμα μιας επόμενης ενότητας.
Σε αυτή την άσκηση θα επεξεργάζεσαι καταγραφές.
Κάθε γραμμή καταγραφής είναι μια συμβολοσειρά με την εξής μορφή: "[<LEVEL>]: <MESSAGE>".
Υπάρχουν τρία διαφορετικά επίπεδα καταγραφής:
INFOWARNINGERRORΈχεις τρεις εργασίες, καθεμία από τις οποίες παίρνει μια γραμμή καταγραφής και σου ζητάει να κάνεις κάτι με αυτήν. Υπάρχουν πολλοί τρόποι να λύσεις αυτές τις εργασίες, διάλεξε τις αγαπημένες σου τεχνικές από τα παραπάνω παραδείγματα και δες τι μπορείς να σκαρφιστείς.
Υλοποίησε τη συνάρτηση message ώστε να επιστρέφει το μήνυμα μιας γραμμής καταγραφής:
"[ERROR]: Invalid operation" | message
# => "Invalid operation"
Τυχόν κενά στην αρχή ή στο τέλος πρέπει να αφαιρούνται:
"[WARNING]: Disk almost full\r\n" | message
# => "Disk almost full"
Υλοποίησε τη συνάρτηση log_level ώστε να επιστρέφει το επίπεδο καταγραφής μιας γραμμής καταγραφής, το οποίο πρέπει να επιστρέφεται με πεζά γράμματα:
"[ERROR]: Invalid operation" | log_level
# => "error"
Υλοποίησε τη συνάρτηση reformat που αναδιαμορφώνει τη γραμμή καταγραφής, βάζοντας πρώτα το μήνυμα και μετά το επίπεδο καταγραφής μέσα σε παρενθέσεις:
"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις jq με 12 έννοιες75 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.