Κανονικές παραστάσεις (regular expressions)

Εικόνα: markos
Submitted by markos on Κυρ, 04/03/2007 - 20:27

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

Για το σκοπό αυτό επινοήθηκαν οι κανονικές παραστάσεις (regular expressions). Χρησιμοποιώντας ειδικούς μεταχαρακτήρες (χαρακτήρες μπαλαντέρ ή wildcards είναι μερικές από τις ονομασίες που έχουν), μπορούμε να ορίσουμε ένα συγκεκριμένο μοτίβο κειμένου το οποίο εφαρμόζεται σε μια λίστα τμημάτων κειμένου. Όποιο από τα τμήματα του κειμένου ταιριάζει στο μοτίβο, γίνεται αποδεκτό. Τα τμήματα αυτά μπορούν να είναι ονόματα αρχείων ή καταλόγων, λέξεις ή ακόμη και φράσεις κειμένου.

Ένα απλό παράδειγμα αφορά τη χρήση του μεταχαρακτήρα “*”. Για να αναφερθούμε σε όλα τα αρχεία του καταλόγου /var/log, αρκεί να δώσουμε /var/log/*, ενώ για όλα αρχεία που έχουν την κατάληξη log, αρκεί να δώσουμε /var/log/*.log.

Στον ακόλουθο πίνακα αναφέρονται οι κυριότεροι μεταχαρακτήρες και η χρήση τους. Σημείωνουμε ότι μπορούν να χρησιμοποιηθούν εξίσου στο κέλυφος για την αντιστοίχιση σε ονόματα αρχείων καθώς και σε επεξεργαστές κειμένου όπως sed, vi, ed και ex αλλά και στις εντολές grep, ωστόσο υπάρχουν ορισμένες διαφορές σε κάθε περίπτωση.

Μεταχαρακτήρας
Λειτουργία
*
Ταυτοποιείται με μηδέν ή περισσότερες εμφανίσεις οποιουδήποτε χαρακτήρα.
?
Ταυτοποιείται με μόνον ένα οποιονδήποτε χαρακτήρα.
^
Αν βρίσκεται στην αρχή της κανονικής παράστασης, τότε αντιστοιχεί στην αρχή της γραμμής κειμένου, αλλιώς απεικονίζεται σαν κανονικός χαρακτήρας. Δηλαδή η κανονική παράσταση ^chapter*, αντιστοιχεί σε όλες τις γραμμές που αρχίζουν με chapter.
$
Αν βρίσκεται στο τέλος της κανονικής παράστασης, τότε αντιστοιχεί με το τέλος της γραμμής κειμένου, αλλιώς απεικονίζεται σαν κανονικός χαρακτήρας .
[set]
Υποδηλώνει ένα σύνολο χαρακτήρων. μπορεί να έχει τις εξής μορφές:
[c1c2c3...] ταυτοποιείται με οποιονδήποτε από τους χαρακτήρες του συνόλου c1, c2 ,c3, ...
[c1-c2] ταυτοποιείται με οποιονδήποτε χαρακτήρα στο σύνολο ASCII (ή οποιαδήποτε κωδικοποιήση ισχύει στο σύστημα) που έχει τιμή ανάμεσα στις τιμές των χαρακτήρων c1, c2. Για παράδειγμα η παράσταση [a-zA-Z] παριστάνει οποιονδήποτε χαρακτήρα από το λατινικό αλφάβητο, αλλά όχι αριθμητικούς χαρακτήρες ή άλλα σύμβολα.
[^set] ταυτοποιείται με την άρνηση του συνόλου set. Για παράδειγμα το [^a-zA-Z] υποδηλώνει οποιονδήποτε χαρακτήρα εκτός από το λατινικό αλφάβητο (δηλαδή περιλαμβάνει και αριθμητικούς χαρακτήρες και άλλα σύμβολα).
{w1, w2, w3, ...}
Ταυτοποιείται με οποιαδήποτε από τις λέξεις w1, w2, w3, ...
\
Επισημαίνει το μεταχαρακτήρα που ακολουθεί, δηλαδή του αφαιρεί την ειδική λειτουργία και τον τυπώνει ως κανονικό χαρακτήρα. Για παράδειγμα, η παράσταση “*file\?” περιλαμβάνει το “?” ως κανονικό χαρακτήρα και αντιστοιχεί σε ονόματα όπως “thisfile?” ή “anotherfile?” αλλά όχι “somefiles”.

Χρειάζεται μεγάλη προσοχή στη χρήση των μεταχαρακτήρων, ειδικά του “*“ και όταν προσπαθείτε να διαγράψετε αρχεία. Για παράδειγμα ή εντολή rm -rf * σβήνει κάθε αρχείο μέσα στον τρέχοντα κατάλογο αλλά και στους περιεχόμενους καταλόγους!

0
Your rating: None